算法讲解:
low逼算法DFS,这里如果不用空间换时间会TLE
所以说我们加入三个判断矩阵
hang[x][i] 第x行有没有出现i
lie[x][i] 第i列有没有出现i
sq[x][y][i] 以x,y为首标号的子矩阵有没有i
然后总结一些常见错误:
1.每次试探成功,hang,lie,sq都要更新
2.我们如果不用bool类型的函数的话那么每次都要在试探语句下面加上强制返回语句,用了bool类型,那么加上if判断就好了
AC代码:
#include"iostream"
#include"cstring"
#include"cstdlib"
#include"cstdio"
using namespace std;
typedef struct node
{
int x;
int y;
}point;
char data[10][10];
bool hang[10][10];
bool lie[10][10];
bool sq[10][10][10];
int starnum;
point star[100];
int flag=0;
void dfs(int x,int y,int num)
{
if(flag==1) return ;
if(num>starnum)
{
flag=1;
return ;
}
else
{
for(int i=1;i<=9;i++)
{
if(hang[x][i]||lie[y][i]||sq[x/3*3][y/3*3][i]) continue;
else
{
data[x][y]='0'+i;
hang[x][i]=lie[y][i]=sq[x/3*3][y/3*3][i]=1;
dfs(star[num+1].x,star[num+1].y,num+1);
if(flag==1) return ;
hang[x][i]=lie[y][i]=sq[x/3*3][y/3*3][i]=0;
data[x][y]='0';
}
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
starnum=flag=0;
memset(data,0,sizeof(data));
memset(hang,0,sizeof(hang));
memset(lie,0,sizeof(lie));
memset(sq,0,sizeof(sq));
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
cin>>data[i][j];
hang[i][data[i][j]-'0']=lie[j][data[i][j]-'0']=sq[i/3*3][j/3*3][data[i][j]-'0']=1;
if(data[i][j]=='0')
{
star[++starnum].x=i;
star[starnum].y=j;
}
}
}
dfs(star[1].x,star[1].y,1);
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
printf("%c",data[i][j]);
}
printf("\n");
}
}
return 0;
}