/*
分析:
很有意思的一道题,DFS的,以后就不怕数独了哈哈~- -I。
我都用的scanf("%s",str)读入的,因为以前做过一道hdu的
题,说是n*n的表格,用了gets读入,最后发现是n*n的表格,不
过在给的时候,不一定是按照n*n来的 - -III。被坑怕了,就用
这个读入了。不过这个题貌似没有这种现象耶……
2012-07-20
*/
分析:
很有意思的一道题,DFS的,以后就不怕数独了哈哈~- -I。
我都用的scanf("%s",str)读入的,因为以前做过一道hdu的
题,说是n*n的表格,用了gets读入,最后发现是n*n的表格,不
过在给的时候,不一定是按照n*n来的 - -III。被坑怕了,就用
这个读入了。不过这个题貌似没有这种现象耶……
2012-07-20
*/
#include"stdio.h"
#include"string.h"
struct A
{
int x,y;
int val;
int hash[10];
}E[85];
int key;
int map[9][9];
int ans;
int judge(int k,int now)
{
int i,l;
int a,b;
int t1,t2;
a=E[k].x/3;
a*=3;
b=E[k].y/3;
b*=3;
for(i=0;i<9;i++)
{
if(i==E[k].x) continue;
if(map[i][E[k].y]==now) return 1;
}
for(l=0;l<9;l++)
{
if(l==E[k].y) continue;
if(map[E[k].x][l]==now) return 1;
}
t1=a+3;
t2=b+3;
for(i=a;i<t1;i++)
{
for(l=b;l<t2;l++)
{
if(i==E[k].x && l==E[k].y) continue;
if(map[i][l]==now) return 1;
}
}
return 0;
}
void DFS(int k)
{
int i;
if(ans) return ;
if(k==key) {ans=1;return ;}
for(i=1;i<=9;i++)
{
if(ans) return ;
if(E[k].hash[i]==-1) continue;
if(judge(k,i)) continue;
map[E[k].x][E[k].y]=i;
E[k].val=i;
DFS(k+1);
map[E[k].x][E[k].y]=0;
}
}
int main()
{
int i,l;
int i2,l2;
char str[5];
int a,b;
while(scanf("%s",str)!=-1)
{
key=0;
if(str[0]=='?') {map[0][0]=0;E[key].x=0;E[key].y=0;key++;}
else map[0][0]=str[0]-'0';
for(l=1;l<9;l++)
{
scanf("%s",str);
if(str[0]=='?') {map[0][l]=0;E[key].x=0;E[key].y=l;key++;}
else map[0][l]=str[0]-'0';
}
for(i=1;i<9;i++)
{
for(l=0;l<9;l++)
{
scanf("%s",str);
if(str[0]=='?') {map[i][l]=0;E[key].x=i;E[key].y=l;key++;}
else map[i][l]=str[0]-'0';
}
}
for(i=0;i<key;i++) memset(E[i].hash,0,sizeof(E[i].hash));
for(i=0;i<key;i++)
{
for(l=0;l<9;l++)
{
if(l==E[i].y) continue;
if(map[E[i].x][l]==0) continue;
E[i].hash[map[E[i].x][l]]=-1;
}
for(l=0;l<9;l++)
{
if(l==E[i].x) continue;
if(map[l][E[i].y]==0) continue;
E[i].hash[map[l][E[i].y]]=-1;
}
a=E[i].x/3;
a*=3;
b=E[i].y/3;
b*=3;
for(i2=a;i2<a+3;i2++)
{
for(l2=b;l2<b+3;l2++)
{
if(i2==E[i].x && l2==E[i].y) continue;
if(map[i2][l2]==0) continue;
E[i].hash[map[i2][l2]]=-1;
}
}
}
ans=0;
DFS(0);
for(i=0;i<key;i++) map[E[i].x][E[i].y]=E[i].val;
for(i=0;i<9;i++)
{
printf("%d",map[i][0]);
for(l=1;l<9;l++) printf(" %d",map[i][l]);
printf("\n");
}
}
return 0;
}