#include #include using namespace std; class range {private: struct I{int x;int operator*(){return x;}bool operator!=(I& lhs){return x> kort; vector done; vector dr = {0, 0, 1, -1}, dc = {1, -1, 0, 0}; bool ok() { int res = 0; for(int r : range(4)) { for(int c : range(4)) { if(kort[r][c] == 0) { continue; } int ideal = r * 4 + c + 1; if(kort[r][c] != ideal) { res++; } } } return res == 0; } bool calc(int r, int c) { if(ok()) { return true; } bool res = false; for(int i : range(dr.size())) { int nr = r + dr[i], nc = c + dc[i]; if(nr < 0 || N <= nr || nc < 0 || N <= nc) { continue; } if(done[kort[nr][nc]]) { continue; } done[kort[nr][nc]] = true; swap(kort[r][c], kort[nr][nc]); res |= calc(nr, nc); swap(kort[r][c], kort[nr][nc]); done[kort[nr][nc]] = false; } return res; } int main(void) { kort.assign(N, vector(N)); done.assign(N*N, 0); int r0, c0; for(int r : range(N)) { for(int c : range(N)) { scanf("%d", &kort[r][c]); if(kort[r][c] == 0) { r0 = r, c0 = c; } } } puts(calc(r0, c0) ? "Yes" : "No"); return 0; }