这题让我对搜索理解加深了,深搜就是在枚举每种出现的可能性中找到满足题意的那种,或者最佳的那种,需不需要返回状况就看,搜索会不会出现返回之前的状况。(好吧这句像废话)
#include<cstdio>
using namespace std;
int v[100][2],a[10][10],num,flag;
bool judge(int x,int y,int k)
{
for(int i=0;i<9;i++)
{
if(a[x][i]==k) return 0;//判断没边上没有重复数字
if(a[i][y]==k) return 0;
}
int tx=(x/3)*3;//小技巧,得到空白区域所在九个小区域的起点
int ty=(y/3)*3;
for(int i=0;i<3;i++)//开始在所属哪个九个小区域里面判断是否有重复数字
{
for(int j=0;j<3;j++)
{
if(a[i+tx][j+ty]==k)
return 0;
}
}
return 1;
}
void dfs(int cap)
{
if(cap<0)
{
flag=1;
return;
}
for(int i=1;i<=9;i++)
{
int x,y;
x=v[cap][0];
y=v[cap][1];
if(judge(x,y,i))
{
a[x][y]=i;
dfs(cap-1);
if(flag)
return;
a[x][y]=0;
}
}
return;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
flag=0,num=0;
char c;
for(int i=0;i<9;i++)
{
getchar();
for(int j=0;j<9;j++)
{
scanf("%c",&c);
a[i][j]=c-'0';
if(a[i][j]==0)//保存下有多少个空格和空格的位置,且就搜索多少次
{
v[num][0]=i;
v[num++][1]=j;
}
}
}
dfs(num-1);
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}
}
return 0;
}