#include <algorithm>
#include <iostream>
#include <math.h>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
char s[10];
int MAP[10][10];
int hang[9][10];
int lie[9][10];
int gong[9][10];
int cacu_g(int x,int y) //重点 计算宫的式子
{
return x/3*3+y/3;
}
void dfs(int now_x,int now_y)
{
if(now_x>8||now_y>8)
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++) cout<<MAP[i][j]<<" ";
cout<<endl;
}
cout<<endl;
return ;
}
if(MAP[now_x][now_y]!=0)
{
if(now_y==8) dfs(now_x+1,0);
else dfs(now_x,now_y+1);
return ;
}
else
{
//int flag=1;
for(int num=1;num<10;num++)
{
if(!gong[cacu_g(now_x,now_y)][num]&&!hang[now_x][num]&&!lie[now_y][num])
{
gong[cacu_g(now_x,now_y)][num]=1;
hang[now_x][num]=1;
lie[now_y][num]=1;
MAP[now_x][now_y]=num;
if(now_y==8) dfs(now_x+1,0);
else dfs(now_x,now_y+1);
MAP[now_x][now_y]=0; //还点
gong[cacu_g(now_x,now_y)][num]=0;
hang[now_x][num]=0;
lie[now_y][num]=0;
}
}
return ;
}
}
int main()
{
while(cout<<"intput the shudu:"<<endl)
{
memset(MAP,0,sizeof(MAP));
memset(hang,0,sizeof(hang));
memset(lie,0,sizeof(lie));
memset(gong,0,sizeof(gong));
for(int i=0;i<9;i++)
{
gets(s);
for(int j=0;j<9;j++)
{
MAP[i][j]=s[j]-'0';
if(MAP[i][j]!=0)
{
hang[i][MAP[i][j]]=1;
lie[j][MAP[i][j]]=1;
gong[cacu_g(i,j)][MAP[i][j]]=1; //所在的宫
}
}
}
cout<<"====================before===================="<<endl;
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++) cout<<MAP[i][j]<<" ";
cout<<endl;
}
cout<<"====================after====================="<<endl;
dfs(0,0);
}
}