#include using namespace std; const int NMax = 100; int v[NMax][NMax]; int whatBox[NMax][NMax]; bool row[NMax][NMax]; bool col[NMax][NMax]; bool box[NMax][NMax]; int main() { freopen("test.in", "r", stdin); int n; cin >> n; int cnt = 0; for(int i = 1; i <= n * n; i++) { for(int j = 1; j <= n * n; j++) { if(whatBox[i][j] == 0) { cnt++; for(int k = i; k < i + n; k++) { for(int p = j; p < j + n; p++) { whatBox[k][p] = cnt; } } } } } int zeros = 0; for(int i = 1; i <= n * n; i++) { for(int j = 1; j <= n * n; j++) { cin >> v[i][j]; if(v[i][j] != 0) { row[i][v[i][j]] = true; col[j][v[i][j]] = true; box[whatBox[i][j]][v[i][j]] = true; } else { zeros++; } } } while(zeros != 0) { int lastZero = zeros; for(int i = 1; i <= n * n; i++) { for(int j = 1; j <= n * n; j++) { if(v[i][j] == 0) { for(int pick = 1; pick <= n * n; pick++) { if(row[i][pick] == false && col[j][pick] == false && box[whatBox[i][j]][pick] == false) { int ways = 0; for(int pos = 1; pos <= n * n; pos++) { if(pos != i) { if(box[whatBox[pos][j]][pick] == false && row[pos][pick] == false && col[j][pick] == false) { ways++; } } } if(ways == 0) { v[i][j] = pick; box[whatBox[i][j]][pick] = true; row[i][pick] = true; col[j][pick] = true; i = 0; j = n * n; zeros--; continue; } ways = 0; for(int pos = 1; pos <= n * n; pos++) { if(pos != j) { if(box[whatBox[i][pos]][pick] == false && row[i][pick] == false && col[pos][pick] == false) { ways++; } } } if(ways == 0) { v[i][j] = pick; box[whatBox[i][j]][pick] = true; row[i][pick] = true; col[j][pick] = true; i = 0; j = n * n; zeros--; continue; } } } } } } for(int i = 1; i <= n * n; i++) { for(int j = 1; j <= n * n; j++) { if(v[i][j] == 0) { int nowBox = whatBox[i][j]; for(int pick = 1; pick <= n * n; pick++) { if(box[nowBox][pick] == true || row[i][pick] == true || col[j][pick] == true) continue; int ways = 0; for(int k = 1; k <= n * n; k++) { for(int p = 1; p <= n * n; p++) { if(v[p][k] == 0 && whatBox[p][k] == nowBox && row[k][pick] == false && col[p][pick] == false) { ways++; } } } if(ways == 1) { v[i][j] = pick; box[nowBox][pick] = true; row[i][pick] = true; col[j][pick] = true; i = n * n; j = n * n; zeros--; pick = n * n; } } } } } if(lastZero == zeros) break; } for(int i = 1; i <= n * n; i++) { for(int j = 1; j <= n * n; j ++) { cout << v[i][j] << " "; } cout << "\n"; } return 0; }