搜索的数独题目 用Judge函数去判断是否满足条件 还有就是深搜的基本步骤就是
{
map[][]=i; // 赋值
dfs(k);// 继续搜索
if(ans) return ; //判断
map[][]=0; // 还原之前的内容
}
这道题在搜索时 ,如果遇到错误的值就会使用map[][]=0;全部回溯,将之前所有的错误数据全部还原
# include <stdio.h>
char map[15][15];
int vis[15][15];
int x[150],y[150];
int ans;
int count;
int Judge(int x,int y,int val)
{
int i,j,a,b;
for(i=0;i<9;i++)
if(i!=x&&vis[i][y]==val)
return 1;
for(j=0;j<9;j++)
if(j!=y&&vis[x][j]==val)
return 1;
for(a=0,i=x/3*3;a<3;a++,i++)
for(b=0,j=y/3*3;b<3;b++,j++)
{
if(i==x&&j==y)
continue;
if(vis[i][j]==val)
return 1;
}
return 0;
}
void dfs(int k)
{
int i;
if(k>=count) ans=1;
if(ans) return ;
for(i=1;i<=9;i++)
{
if(Judge(x[k],y[k],i)) continue;
vis[x[k]][y[k]]=i;
dfs(k+1);
if(ans)
return ;
vis[x[k]][y[k]]=0;
}
return ;
}
int main ()
{
int T,i,j;
int mark=0,flag;
scanf("%d",&T);
while(T--)
{
count=0;
if(mark)
scanf("%s",map[i]);
for(i=0;i<9;i++)
scanf("%s",map[i]);
for(i=0;i<9;i++)
for(j=0;j<9;j++)
if(map[i][j]=='?')
{
vis[i][j]=0;
x[count]=i;
y[count]=j;
count++;
}
else
vis[i][j]=map[i][j]-'0';
flag=0;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
if(vis[i][j]&&Judge(i,j,vis[i][j]))
{
flag=1;
break;
}
if(flag)
break;
}
ans=0;
if(!flag)
{dfs(0);}
if(mark)
printf("---\n");
if(ans)
{
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
printf("%d",vis[i][j]);
}
printf("\n");
}
}
else
printf("impossible\n");
mark=1;
}
return 0;
}