DFS解数独问题

来源:互联网 发布:linux 病毒查杀 编辑:程序博客网 时间:2024/05/29 13:46
#include<stdio.h>#define M 9int 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][n]==a[m][n])return 0;}for(i=0; i<M; i++) //检测列重复{if(i!=n && a[m][i]==a[m][n])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][n])return 0;}return 1;}void f(int m,int n){        int k;if(count==0) //所有空格都填好,则输出结果{print();return;}if(a[m][n]==0){for(k=1; k<=M; k++){count--;a[m][n]=k;//print();if(check(m,n)){if(n<M-1)f(m,n+1);elsef(m+1,0);}                        a[m][n]=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文件,数据格式如下:例子:200080300060070084030500209000105408000000000402706000301007040720040060004010003*/

                                             
0 0
原创粉丝点击