您的位置:首页 > 编程语言 > C语言/C++

DFS解数独问题

2014-09-07 09:19 459 查看
#include<stdio.h>
#define M 9

int a[M][M],count;

void print()
{
int i,j;
for(i=0; i<M; i++)
{
for(j=0; j<M; j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
printf("\n");
}

int check(int m,int n)
{
int i,j;
for(i=0; i<M; i++) //检测行重复
{
if(i!=m && a[i]
==a[m]
)
return 0;
}
for(i=0; i<M; i++) //检测列重复
{
if(i!=n && a[m][i]==a[m]
)
return 0;
}
for(i=m/3*3; i<(m/3+1)*3; i++) //检测block重复
for(j=n/3*3; j<(n/3+1)*3; j++)
{
if((i!=m || j!=n) && a[i][j]==a[m]
)
return 0;
}
return 1;
}

void f(int m,int n)
{
int k;
if(count==0) //所有空格都填好,则输出结果
{
print();
return;
}
if(a[m]
==0)
{
for(k=1; k<=M; k++)
{
count--;
a[m]
=k;
//print();
if(check(m,n))
{
if(n<M-1)
f(m,n+1);
else
f(m+1,0);
}
a[m]
=0;
count++;
}
}
else
{
if(n<M-1) f(m,n+1);
else f(m+1,0);
}
}

int main()
{
int i,j;
FILE *fp;
fp = fopen("puzzle.txt","r");
for(i=0; i<M; i++)
for(j=0; j<M; j++)
{
fscanf(fp,"%1d",&a[i][j]);
if(a[i][j]==0) count++;
}
print();
f(0,0);
fclose(fp);
return 0;
}

/*
需有一个puzzle.txt文件,数据格式如下:
例子:
200080300
060070084
030500209
000105408
000000000
402706000
301007040
720040060
004010003
*/



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息