#include using namespace std; const int NMax = 30; int mat[NMax][NMax]; int whatBox[NMax][NMax]; bool row[NMax][NMax]; bool col[NMax][NMax]; bool inBox[NMax][NMax]; inline void MakeBoxes(const int &sz, const int &n) { int box = 0; for(int i = 1; i <= sz; i++) { for(int j = 1; j <= sz; j++) { if(whatBox[i][j] == 0) { box++; for(int k = i; k < i + n; k++) { for(int p = j; p < j + n; p++) { whatBox[k][p] = box; } } } } } } inline bool onRow(const int &x, const int &sz, const int &pick) { int ways = 0; for(int i = 1; i <= sz; i++) { if(mat[x][i] == 0 && col[i][pick] == false && inBox[whatBox[x][i]][pick] == false) { ways++; } } if(ways == 1) return true; return false; } inline bool onCol(const int &y, const int &sz, const int &pick) { int ways = 0; for(int i = 1; i <= sz; i++) { if(mat[i][y] == 0 && row[i][pick] == false && inBox[whatBox[i][y]][pick] == false) { ways++; } } if(ways == 1) return true; return false; } inline bool onBox(const int &box, const int &sz, const int &pick) { int ways = 0; for(int i = 1; i <= sz; i++) { for(int j = 1; j <= sz; j++) { if(whatBox[i][j] == box && mat[i][j] == 0) { if(row[i][pick] == false && col[j][pick] == false) { ways++; } } } } if(ways == 1) return true; return false; } inline bool Solve(const int &sz, const int &n) { for(int i = 1; i <= sz; i++) { for(int j = 1; j <= sz; j++) { if(mat[i][j] == 0) { for(int pick = 1; pick <= sz; pick++) { if(row[i][pick] == false && col[j][pick] == false && inBox[whatBox[i][j]][pick] == false) { if(onRow(i, sz, pick) || onCol(j, sz, pick) || onBox(whatBox[i][j], sz, pick)) { row[i][pick] = true; col[j][pick] = true; inBox[whatBox[i][j]][pick] = true; mat[i][j] = pick; return true; } } } } } } return false; } int main() { ios::sync_with_stdio(false); //freopen("in.txt", "r", stdin); int n; cin >> n; int sz = n * n; MakeBoxes(sz, n); for(int i = 1; i <= sz; i++) { for(int j = 1; j <= sz; j++) { cin >> mat[i][j]; if(mat[i][j] != 0) { row[i][mat[i][j]] = true; col[j][mat[i][j]] = true; inBox[whatBox[i][j]][mat[i][j]] = true; } } } while(Solve(sz, n)); for(int i = 1; i <= sz; i++) { for(int j = 1; j <= sz; j++) { cout << mat[i][j] << " "; } cout << "\n"; } return 0; }