#include<iostream>
using namespace std;
char f[9][10];//字符型的数据读取每次只能读一个!
int a[9][9];
void search(int);//深搜递归
void init();//初始化
int check(int,int);//判断
void output();//输出
int main()
{
init();
search(0);
return(0);
}
void search(int m)
{
int i;
if(m==81) //关键!!!用m判断结束与数组位置很方便,只需后来将m转换到二维数组的形式
{
output();
}
else
{
if(a[m/9][m%9]!=0)
{
search(m+1);
}
else
{
for(i=1;i<=9;i++)
{
if(check(m,i))
{
a[m/9][m%9]=i;
search(m+1);
a[m/9][m%9]=0;
}
}
}
}
}
int check(int m,int i)
{
int j,k;
int row,col; //行列。关键!!!将m转化为2维数组的形式
row=m/9;
col=m%9;
int x,y;
x=(row/3)*3;//中方格第一行
y=(col/3)*3;//中方格第一列
for(j=0;j<=8;j++)//判断列
{
if(a[j][col]==i)
{
return(0);
}
}
for(j=0;j<=8;j++)//判断行
{
if(a[row][j]==i)
{
return(0);
}
}
for(j=x;j<=x+2;j++)
{
for(k=y;k<=y+2;k++)
{
if(a[j][k]==i)
{
return(0);
}
}
}
return(1);
}
void init()
{
int i,j;
for(i=0;i<=8;i++)
{
for(j=0;j<=8;j++)
{
cin>>f[i][j];
a[i][j]=f[i][j]-48; //将输入转化为整型存于a中
}
}
}
void output()
{
int i,j;
for(i=0;i<=8;i++)
{
for(j=0;j<=8;j++)
{
if(j<8)
{
cout<<a[i][j];
}
else
{
cout<<a[i][j]<<endl;
}
}
}
}