#include #include #include #include using namespace std; vector> a, sol; vector> onRow, onCol, onCell; int n; bool solved; int cell(int i, int j) { return (i/n) * n + (j/n); } void place(int i, int j, int k) { onRow[i][k] = true; onCol[j][k] = true; onCell[cell(i, j)][k] = true; a[i][j] = k; } void unplace(int i, int j, int k) { onRow[i][k] = false; onCol[j][k] = false; onCell[cell(i, j)][k] = false; a[i][j] = 0; } void read() { cin >> n; a = vector>(n*n+1, vector(n*n+1)); onRow = onCol = onCell = vector>(n*n+1, vector(n*n+1)); for (int i = 0; i < n*n; ++i) { for (int j = 0; j < n*n; ++j) { int x; cin >> x; if (x != 0) place(i, j, x); } } } void back(int i, int j) { if (solved) return; if (j == n*n) { if (i == n*n-1) { sol = a; solved = true; return; } back(i+1, 0); return; } if (a[i][j] != 0) { back(i, j+1); } else { for (int k = 1; k <= n*n; ++k) { if (onRow[i][k] || onCol[j][k] || onCell[cell(i, j)][k]) continue; place(i, j, k); back(i, j+1); unplace(i, j, k); } } } void print() { for (int i = 0; i < n*n; ++i) { for (int j = 0; j < n*n; ++j) { cout << sol[i][j] << " "; } cout << "\n"; } } void solve() { read(); solved = false; back(0, 0); print(); } int main() { int tests = 1; for (;tests; --tests) { solve(); } }