数独问题。。。。。。dfs+暴力搜索- -诶,只能这个水平了。。
2012-11-17 09:38
716 查看
/************************ 数独问题 ***************************/ /*** 此程序可以解出任何一个数独的一个解,如果存在的话。 ***/ /********** 输入时请直接输入9*9的矩阵,空白处填0 ***********/ /********************** 2012-11-06 ***************************/ #include <iostream> using namespace std; int data[9][9]; int put[81][2]; int total; bool judge(int i,int j,int k) { for (int l=0;l<=8;l++) if (data[i][l]==k || data[l][j]==k) return false; int x=(i/3)*3,y=(j/3)*3; for (int l=x;l<=x+2;l++) for (int m=y;m<=y+2;m++) if (data[l][m]==k) return false; return true; } void print() { for (int i=0;i<=8;i++) { for (int j=0;j<=8;j++) { cout << data[i][j]; if (j==2 || j==5) cout << " |"; if (j!=8) cout << " "; } cout << endl; if (i==2 || i==5) cout << "- - - + - - - + - - -" << endl; } } bool dfs(int l) { if (l==total) return true; else { for (int k=1;k<=9;k++) { if (judge(put[l][0],put[l][1],k)) { data[put[l][0]][put[l][1]]=k; if (dfs(l+1)) return true; data[put[l][0]][put[l][1]]=0; } } } return false; } int main() { int c; while (cin >> c) { total=0; for (int i=0;i<=80;i++) { int j=i/9,k=i%9; if (i!=0 || j!=0) cin >> c; data[j][k]=c; if (c==0) { total++; put[total-1][0]=j;put[total-1][1]=k; } } cout << endl; if (dfs(0)) print(); else cout << "No solution!!" << endl; cout << "-------------------------------------" << endl; } return 0; }
相关文章推荐
- !HDU 5305 朋友关系网一半网友问题-dfs-(暴力搜索)
- poj 2676(dfs求解数独问题,对行列和格子分别加bool数组优化搜索)
- 【算法学习笔记】18.暴力求解法06 隐式图搜索2 八数码问题 未启发
- POJ 2034 反素数,素数筛选,DFS暴力搜索
- 2013年第四届蓝桥杯C/C++省赛 第39级台阶(结果填空) ----DFS深度搜索遍历和暴力搜索
- HDU 5167 Fibonacci(DFS暴力搜索)
- bootstraptable只能搜索当前页问题
- HDU-N皇后问题-DFS深度搜索
- nyoj 部分和问题(深度优先搜索DFS)
- 搜索文档时遇到的问题,同这个老外遇到的问题一样
- POJ 1129 Channel Allocation DFS搜索 着色问题
- ZOJ 3631超大背包问题(DFS || 折半搜索)
- POJ 1321-棋盘问题-简单搜索DFS
- poj 1321 棋盘问题 dfs搜索
- 暴力搜索 回溯法 —— 八皇后问题
- 搜索入门之dfs--经典的迷宫问题解析
- nyist oj 1058 部分和问题 (DFS搜索)
- hdu 2553 N皇后问题----搜索 dfs 回溯法 预处理
- NYOJ1058+NYOJ1282 部分和问题(深度优先搜索DFS入门题)
- HDU 1016 搜索问题 dfs