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 */
相关文章推荐
- HDU_1426——数独问题,DFS
- 数独问题(DFS回溯)
- 数独问题。。。。。。dfs+暴力搜索- -诶,只能这个水平了。。
- [DFS]poj 2676 Sudoku 数独问题
- poj 2676(dfs求解数独问题,对行列和格子分别加bool数组优化搜索)
- Sudoku 数独问题(dfs)
- hdu Problem-1426数独问题(dfs+回溯+枚举)
- hdu 1426 Sudoku Killer(DFS 数独问题)
- 数独问题(DFS回溯)
- POJ 1321 棋盘问题(DFS深度优先搜索/回溯法)
- 数独求解——面向对象解决算法问题(一)
- 今天写dfs时发现到一个需要注意的问题
- POJ 1321 棋盘问题类似八皇后 dfs搜索
- poj 1321 棋盘问题 DFS+回溯 回溯学习
- ruby解数独问题
- POJ 1129 Channel Allocation DFS搜索 着色问题
- Sicily 1153 马的周游问题(DFS深度优先搜索)
- 数独求解——面向对象解决算法问题(二)
- POJ 2488 爵士游行问题--DFS遍历
- POJ 1321 棋盘问题(DFS+回溯)