这个数独的程序快的我自己都不太相信,毫无优化单纯深搜,速度还是令人满意的。直接上代码:
#include<stdio.h>
#include<stdlib.h>
int vis[101][101]={0},vis2[101][101]={0},vis3[101][101]={0},vis4[101][101]={0},w[101][101]={0},ans[101][101]={0};
int flag=0;
void write()
{
int i,j;
printf("\n");
for(i=1;i<=9;i++)
{
if((i-1)%3==0)
printf("---------------------------\n");
for(j=1;j<=9;j++)
{
printf("%d ",w[i][j]);
if(j%3==0)
printf(" | ");
}
printf("\n");
}
printf("---------------------------\n");
return;
}
int dfs(int x,int y)
{
int i;
if(flag==1)
return 0;
if(x==10&&y==1)
{
write();
//flag=1;
return 0;
}
if(vis[x][y]==1||w[x][y]!=0)
{
if(y==9)
dfs(x+1,1);
else dfs(x,y+1);
return 0;
}
for(i=1;i<=9;i++)
if(vis2[x][i]==0&&vis3[y][i]==0&&vis4[(x-1)/3+(y-1)/3*3][i]==0)
{
vis2[x][i]=1;
vis3[y][i]=1;
vis4[(x-1)/3+(y-1)/3*3][i]=1;
w[x][y]=i;
if(y==9)
dfs(x+1,1);
else dfs(x,y+1);
w[x][y]=0;
vis2[x][i]=0;
vis3[y][i]=0;
vis4[(x-1)/3+(y-1)/3*3][i]=0;
}
return 0;
}
int main()
{
int i,j;
for(i=1;i<=9;i++)
for(j=1;j<=9;j++)
{
scanf("%d",&w[i][j]);
if(w[i][j]!=0)
{
vis[i][j]=1;
vis2[i][w[i][j]]=1;
vis3[j][w[i][j]]=1;
vis4[(i-1)/3+(j-1)/3*3][w[i][j]]=1;
}
}
write();
printf("\n");
dfs(1,1);
return 0;
}
第一次write是想让输入看的更清楚一些。