题意:求解数独问题
思路:dfs深搜,注意用三个数组保存每行每列每个小九宫格是否存在某数字,
通过这个题目初步了解了dfs的大概用法,对其中的栈的返回有了新的理解(每一层栈都有返回值);,
#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
char aa[11][11];
int a[11][11];
int x[11][11],y[11][11],z[5][5][11];
int dfs(int p,int q)
{
if(p==10) return 1;
int flag=1;
if(a[p][q]>0)
{
if(q+1<=9)
flag=dfs(p,q+1);
else if
(q+1==10) flag=dfs(p+1,1);
if(flag)
return 1;
else
return 0;
}
else
{
for(int i=1;i<=9;i++)
{
if( !x[p][i] && !y[q][i] && !z[(p-1)/3+1][(q-1)/3+1][i])
{
a[p][q]=i;
x[p][i]=y[q][i]=z[(p-1)/3+1][(q-1)/3+1][i]=1;
if(q+1<=9)
flag=dfs(p,q+1);
else if(q+1==10)
flag=dfs(p+1,1);
if(!flag)
{
x[p][i]=y[q][i]=z[(p-1)/3+1][(q-1)/3+1][i]=0;
a[p][q]=0;
}
else
return 1;
}
else continue;
}
return 0;
}
}
int main()
{
//freopen("in.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
memset(z,0,sizeof(z));
for(int i=0;i<9;i++)
scanf("%s",aa[i]);
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
{
a[i][j]=aa[i-1][j-1]-'0';
if(a[i][j]>0)
x[i][a[i][j]]=y[j][a[i][j]]=z[(i-1)/3+1][(j-1)/3+1][a[i][j]]=1;
}
dfs(1,1);
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}
}
}