您的位置:首页 > 其它

poj 1676 sudoku 数独

2012-07-10 10:23 363 查看
求解数独答案,深度优先搜索即可.原来以为搜索解数独会很慢,最近一个芬兰数学家号称设计了世界最难数独,发现我的程序也是秒出结果,数独的搜索量还是挺小的.

#include<stdio.h>
#include<string.h>
int map[10][10];
int has[3][10][10];
int cal(int x,int y)
{
return 1+((y-1)/3)*3+(x-1)/3;
}
void out()
{
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
printf("%d",map[i][j]);
puts("");
}

}
int dfs(int x,int y)
{
if(y==0)
{
if(x==1)
{
out();return 1;
}
else x--,y=9;
}

if(map[x][y]!=0)
return dfs(x,y-1);

for(int i=1;i<=9;i++)
{
int tmp=cal(x,y);
if(has[0][x][i]==0&&has[1][y][i]==0&&has[2][tmp][i]==0)
{
has[0][x][i]=1;has[1][y][i]=1;has[2][tmp][i]=1;
map[x][y]=i;
if(dfs(x,y-1)) return 1;
map[x][y]=0;
has[0][x][i]=0;has[1][y][i]=0;has[2][tmp][i]=0;
}
}
return 0;
}

int main()
{
char sz[20];
int n,ge;
int i,j;
//freopen("test.txt","r",stdin);
scanf("%d",&n);
while(n--)
{
memset(map,0,sizeof map);
memset(has,0,sizeof has);
for(i=1;i<=9;i++)
{
scanf("%s",sz+1);
for(j=1;j<=9;j++)
{
map[i][j]=sz[j]-'0';
if(map[i][j])
{
has[0][i][map[i][j]]=1;
has[1][j][map[i][j]]=1;
has[2][cal(i,j)][map[i][j]]=1;
}
}
}
dfs(9,9);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: