#include #include using namespace std; using Table = array, 6>; int dx[] = { 0, 1, 0, -1 }; int dy[] = { 1, 0, -1, 0 }; bool recur(const Table & table, const array & used, int x, int y){ bool is_finish = true; for (size_t y = 1; y < 5; y++){ for (size_t x = 1; x < 5; x++){ if (y==4 && x==4) continue; if (table[x][y] != x + (y - 1) * 4) is_finish = false; } } if (is_finish) return true; for (size_t i = 0; i < 4; i++){ int nx = x + dx[i]; int ny = y + dy[i]; if (table[nx][ny] != -1 && !used[table[nx][ny]]){ auto nt = table; nt[x][y] = table[nx][ny]; nt[nx][ny] = 0; auto nu = used; nu[table[nx][ny]] = true; if(recur(nt, nu, nx, ny)) return true; } } return false; } int main(){ Table table; for (size_t i = 0; i < 6; i++){ table[i][0] = -1; table[i][5] = -1; table[0][i] = -1; table[5][i] = -1; } int x_zero, y_zero; for (size_t y = 1; y < 5; y++){ for (size_t x = 1; x < 5; x++){ cin >> table[x][y]; if (table[x][y] == 0){ x_zero = x; y_zero = y; } } } array used; used.fill(false); cout << (recur(table, used, x_zero, y_zero) ? "Yes" : "No") << endl; return 0; }