#include<iostream>
using namespace std;
int begin[9][9];
bool check(int x,int y,int k)
{
for(int i=0;i<9;i++)
if(begin[i][y]==k)
return false;
for(int j=0;j<9;j++)
if(begin[x][j]==k)
return false;
int sx=(x/3)*3;
int sy=(y/3)*3;
for(int i=sx;i<sx+3;i++)
for(int j=sy;j<sy+3;j++)
if(begin[i][j]==k)
return false;
return true;
}
bool dfs(int x,int y)
{
if(begin[x][y])//这个if用来深度搜索
{
if(y+1<9)
{
if(dfs(x,y+1))//y++也就是遍历第一行
return true;
}
else if(x+1<9)
{
if(dfs(x+1,0))// 当列不能再加的时候再从第二行的第一列开始循环;
return true;
}
else
return true;
}
else
{
for(int k=1;k<=9;k++)
{
if(check(x,y,k))
{
begin[x][y]=k;
if(y+1<9)
{
if(dfs(x,y+1))
return true;
}
else if(x+1<9)
{
if(dfs(x+1,0))
return true;
}
else
return true;
begin[x][y]=0;
}
}
}
return false;
}
int main()
{
int t;
cin>>t;
while(t--)
{
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
cin>>begin[i][j];
dfs(0,0);
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
cout<<begin[i][j]<<" ";
}
cout<<endl;
}
}
//system("pause");
return 0;
}
数独问题(南阳)