题目链接:hdu3111
果断水过....
#include<stdio.h>
int map[9][9];
int flag,num;
struct node
{
int x,y;
}s[81];
bool judge(int t,int cur)
{
int i,j;
for(i = 0 ; i < 9 ;i ++)
if( map[i][ s[cur].y ] == t || map[ s[cur].x ][i] == t)
return 0;
int x = s[cur].x/3*3;
int y = s[cur].y/3*3;
for(i = 0 ; i < 3 ; i ++)
for(j = 0 ; j < 3 ; j ++)
if(map[x + i][y + j] == t)
return 0;
return 1;
}
void dfs(int cur)
{
int i;
if(cur == num)
{
flag = 1;
return ;
}
if(flag) return;
for(i = 1 ; i <= 9 ; i++)
if(judge(i,cur) && !flag)
{
map[ s[cur].x ][ s[cur].y ] = i;
dfs(cur + 1);
if(flag) return ;
map[ s[cur].x ][ s[cur].y ] = 0;
}
}
int main()
{
//freopen("in.txt","r",stdin);
int T,i,j,p = 0;
char a[10];
scanf("%d",&T);
while(T--)
{
num = 0;
if(p)scanf("%s",a);
for(i = 0 ; i < 9 ; i ++)
{
scanf("%s",a);
for(j = 0 ; j < 9 ; j ++)
{
if(a[j] == '?')
{
s[num].x = i;
s[num].y = j;
num ++;
map[i][j] = 0;
continue;
}
map[i][j] = a[j] - '0';
}
}
flag = 0;
dfs(0);
if(p) printf("---\n");
if(flag)
{
for(i = 0 ; i < 9 ; i ++)
{
for(j = 0 ; j < 9 ; j ++)
{
printf("%d",map[i][j]);
}
printf("\n");
}
}
else
printf("impossible\n");
p ++;
}
return 0;
}