#include #include #include using namespace std; const int dx[] = { -1, 1, 0, 0 }; const int dy[] = { 0, 0, -1, 1 }; vector a(16); vector locked(16); int index(int x, int y) { return x + 4 * y; } bool scan(int space) { bool result = true; for (int i = 0; i < 16 - 1; ++i) { if (a[i] != (i + 1)) { result = false; break; } } if (result) { return result; } int x = space % 4; int y = space / 4; for (int i = 0; i < 4; ++i) { if (0 <= x + dx[i] && x + dx[i] < 4 && 0 <= y + dy[i] && y + dy[i] < 4) { int moved = index(x + dx[i], y + dy[i]); if (!locked[moved]) { swap(a[space], a[moved]); locked[space] = true; result = scan(moved); locked[space] = false; swap(a[space], a[moved]); if (result) { return true; } } } } return false; } int main() { for (int i = 0; i < 16; ++i) { cin >> a[i]; } int space = distance(a.begin(), find(a.begin(), a.end(), 0)); cout << (scan(space) ? "Yes" : "No") << endl; return 0; }