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);
}
}
#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);
}
}
相关文章推荐
- 简单搜索(数独)poj 2676 Sudoku
- POJ 2676-Sudoku(DFS-数独)
- poj 2676 sudoku ( 数独)----DFS
- [DFS]poj 2676 Sudoku 数独问题
- POJ 2676 Sudoku (数独求解器 DFS)
- POJ 2676 Sudoku (数独 搜索)
- POJ - 2676 Sudoku-9X9方格数独填数
- POJ - 2676 Sudoku解题报告(解数独)
- POJ 2676:Sudoku 数独
- 数独问题的介绍及POJ 2676-Sudoku(dfs+剪枝)
- 【POJ】2676 Sudoku 【数独】精确覆盖
- LA_2659_POJ_3076_ZOJ_3122_Sudoku(DancingLinksX精确覆盖,数独题模板)
- 搜索 --- 数独求解 POJ 2676 Sudoku
- POJ 2676:Sudoku 数独
- POJ 3074 Sudoku【DancingLinks,数独】
- POJ 2676Sudoku(数独)
- POJ 2676 Sudoku 数独
- POJ 2676 Sudoku【DancingLinks,数独】
- 搜索 --- 数独求解 POJ 2676 Sudoku
- poj Sudoku(数独) DFS