#include <iostream>
using namespace std;
/**
* 回溯算法
* row[i][num]表示第i行是否出现过num
* col[j][num]表示第j列是否出现过num
* area[k][num]表示第k个3*3单元格是否出现过num k = 3*(row/3) + (col/3)
* 回溯过程:
* 当前格子没有数字--->遍历并根据限制条件选取可靠数字填入,更新限制条件,递归填写下一格
* 当前格子存在数字--->递归填写下一格
* 当前无法填入任何数字--->还原限制条件和已填入的数字,回到上一格再尝试下一个可用数字
* 知道所有格子都填上数字,遍历结束
*/
int num[9][9], flag = 0;
bool row[9][10] = {0}, col[9][10] = {0}, area[9][10] = {0};
void dfs(int index) {
if (index == 81) {
flag = 1;
return;
}
int i = index / 9;
int j = index % 9;
if (num[i][j]) dfs(index + 1);
else {
for (int k = 1; k < 10; ++k) {
int curRow = row[i][k];
int curCol = col[j][k];
int curArea = area[3 * (i / 3) + (j / 3)][k];
if (!row[i][k] && !col[j][k] && !area[3 * (i / 3) + (j / 3)][k]) {
num[i][j] = k;
row[i][k] = 1;
col[j][k] = 1;
area[3 * (i / 3) + (j / 3)][k] = 1;
dfs(index + 1);
if (flag) return;
num[i][j] = 0;
row[i][k] = curRow;
col[j][k] = curCol;
area[3 * (i / 3) + (j / 3)][k] = curArea;
}
}
}
}
int main() {
int x;
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
cin >> x;
num[i][j] = x;
// 初始化状态
if (x) {
row[i][x] = 1;
col[j][x] = 1;
area[3 * (i / 3) + (j / 3)][x] = 1;
}
}
}
dfs(0);
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
cout << num[i][j] << " ";
}
cout << endl;
}
return 0;
}