|
ac:
#include<stdio.h>
int num, flag, map[10][10];
struct point
{
int x, y;
} p[81];
int judge(int n, int k)
{
int i, j, x, y;
for(i = 0; i < 9; i++)
{
if(i != p[n].y && map[p[n].x][i] == k)///跳过本身判断行是否有重复
return 0;
if(i != p[n].x && map[i][p[n].y] == k)///跳过本身判断列是否有重复
return 0;
}
x = p[n].x / 3 * 3;///巧妙的运用出发,快速判断位置
y = p[n].y / 3 * 3;
for(i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
if(map[x+i][y+j] == k && (i != p[n].x || j != p[n].y))///k在九宫格内部重复,k跳过本身位置比较
return 0;
return 1;
}
void dfs(int n)
{
int i;
if(n == num)
{
flag = 1;
return;
}
for(i = 1; i < 10; i++)
{
if(judge(n, i))
{
map[p[n].x][p[n].y] = i;
dfs(n + 1);
if(flag) return;
map[p[n].x][p[n].y] = 0;
}
}
return;
}
int main()
{
int i, j, t = 0;
char s[2];
while(scanf("%s", s) != -1)
{
num = flag = 0;
if(s[0] == '?')
p[num].x = 0, p[num++].y = 0, map[0][0] = 0;
else
map[0][0] = s[0] - '0';
for(i = 0; i < 9; i++)
for(j = 0; j < 9; j++)
if(i || j)
{
scanf("%s", s);
if(s[0] == '?')
p[num].x = i, p[num++].y = j, map[i][j] = 0;
else
map[i][j] = s[0] - '0';
}
dfs(0);
if(t++)
printf("\n");
for(i = 0; i < 9; i++)
{
for(j = 0; j < 8; j++)
printf("%d ", map[i][j]);
printf("%d\n", map[i][8]);
}
}
return 0;
}