#include <stdio.h>
#define SIZE 9
int mp[SIZE][SIZE]={0};;//存储数独
int find_answer_ok;
int check(int row, int col, int val)
{ //检验在当前位置填入val后,满足要求与否
//同行
for(int i = 0; i < 9; i++)
{
if(mp[row][i] == val)
{
return 0;
}
}
//同列
for(int i = 0; i < 9; i++)
{
if(mp[i][col] == val)
{
return 0;
}
}
//同一个九宫格
int limit_row = row / 3 * 3 + 3;//九宫格行的终点
int limit_col = col / 3 * 3 + 3;//九宫格列的终点
for(int i = limit_row - 3; i < limit_row; i++)
{
for(int j = limit_col - 3; j < limit_col; j++)
{
if(mp[i][j] == val)
{
return 0;
}
}
}
return 1;
}
void dfs(int row, int col)
{ //当前行、列
if(col > 8)
{
row++;
col = 0;
}
if(row > 8)
{
find_answer_ok = 1;
return ;
}
if(mp[row][col] == 0)
{
for(int i = 1; i <= 9; i++)
{
if(check(row, col, i))
{ //check后满足
mp[row][col] = i;
dfs(row, col + 1);
if(find_answer_ok)
{ //已经找到答案了,直接return
return ;
}
mp[row][col] = 0; //没找到答案,回溯
}
}
}
else
{
dfs(row, col + 1);
}
}
int main(void)
{
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
scanf("%d",&mp[i][j]);
}
}
dfs(0, 0);//起点坐标(0,0)
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
printf("%d ",mp[i][j]);
}
printf("\n");
}
return 0;
}