poj--2676 Sudoku(dfs)
来源:互联网 发布:jquery数组去掉字符串 编辑:程序博客网 时间:2024/05/16 11:04
Sudoku
题解
- 从左上角到右下角一行一行填数。
- 递归需要返回状态,即填数是否成功,如果成功就无需回溯,否则需要回溯。
#include <iostream>#include <cstdio>#include <string>#include <algorithm>#include <cstring>using namespace std;#define MEM(a, v) memset(a, v, sizeof(a))const int N = 9;int a[N+1][N+1];int rowFlag[N+1][N+1], colFlag[N+1][N+1], squFlag[N+1][N+1];int t;string s;bool Sudoku(int r, int c){ if(r > N) return true; bool flag = false; if(a[r][c]){ if(c == N) flag = Sudoku(r + 1, 1); else flag = Sudoku(r, c + 1); return flag; } for(int i = 1; i <= N; ++i){ int k = 3*((r-1)/3)+(c-1)/3 + 1; if(!rowFlag[r][i] && !colFlag[c][i] && !squFlag[k][i]){ rowFlag[r][i] = colFlag[c][i] = squFlag[k][i] = 1; a[r][c] = i; if(c == N) flag = Sudoku(r + 1, 1); else flag = Sudoku(r, c + 1); if(flag) return true; // 填数成功不回溯 a[r][c] = 0; rowFlag[r][i] = colFlag[c][i] = squFlag[k][i] = 0; } } return false;}int main(){#ifdef EXMYfreopen("data.in", "r", stdin);#endif // EXMY /// 712K 438MS cin >> t; while(t--){ MEM(rowFlag, 0); MEM(colFlag, 0); MEM(squFlag, 0); for(int i = 1; i <= N; ++i){ cin >> s; for(int j = 1; j <= s.length(); ++j){ int t = s[j-1] - '0'; a[i][j] = t; if(a[i][j]){ int k = 3*((i-1)/3)+(j-1)/3 + 1; rowFlag[i][t] = colFlag[j][t] = squFlag[k][t] = 1; } } } Sudoku(1, 1); for(int i = 1; i <= N; ++i){ for(int j = 1; j <= N; ++j) cout << a[i][j]; cout << endl; } } return 0;}
还可以更简洁:
#include <iostream>#include <cstdio>#include <string>#include <algorithm>#include <cstring>using namespace std;#define MEM(a, v) memset(a, v, sizeof(a))const int N = 9;int a[N+1][N+1];int rowFlag[N+1][N+1], colFlag[N+1][N+1];int squFlag[3][3][N+1];int t;string s;bool Sudoku(int k){ if(k >= N * N) return true; int r = k / 9; int c = k % 9; if(a[r][c]) return Sudoku(k + 1); for(int i = 1; i <= N; ++i){ if(!rowFlag[r][i] && !colFlag[c][i] && !squFlag[r/3][c/3][i]){ rowFlag[r][i] = colFlag[c][i] = squFlag[r/3][c/3][i] = 1; a[r][c] = i; if(Sudoku(k + 1)) return true; rowFlag[r][i] = colFlag[c][i] = squFlag[r/3][c/3][i] = 0; a[r][c] = 0; } } return false;}int main(){#ifdef EXMYfreopen("data.in", "r", stdin);#endif // EXMY cin >> t; while(t--){ MEM(rowFlag, 0); MEM(colFlag, 0); MEM(squFlag, 0); for(int i = 0; i < N; ++i){ cin >> s; for(int j = 0; j < s.length(); ++j){ int t = s[j] - '0'; a[i][j] = t; if(a[i][j]){ rowFlag[i][t] = colFlag[j][t] = squFlag[i/3][j/3][t] = 1; } } } Sudoku(0); for(int i = 0; i < N; ++i){ for(int j = 0; j < N; ++j) cout << a[i][j]; cout << endl; } }}
0 0
- POJ 2676 Sudoku dfs
- poj 2676 sudoku(DFS)
- POJ 2676 sudoku dfs
- POJ 2676 SuDoKu DFS
- POJ-2676-Sudoku-DFS
- [poj 2676] Sudoku DFS
- POJ-2676 Sudoku(DFS)
- POJ-2676 Sudoku(DFS)
- poj--2676 Sudoku(dfs)
- POJ 2676 sudoku DFS
- POJ-dfs-2676-Sudoku
- poj 2676 Sudoku(dfs)
- Poj 2676 Sudoku[dfs]
- POJ 2676 Sudoku 【dfs】
- POJ 2676 Sudoku(DFS回溯)
- poj 2676 Sudoku (dfs)
- POJ 2676-Sudoku(DFS)
- POJ 2676 Sudoku(dfs)
- 四边形不等式优化DP学习小记
- 对《教会徒弟,饿死师傅的理解》
- nRF24L01无线模块使用(待写。。。)
- 洛谷2665 连线游戏-------暴力
- centos英文转中文
- poj--2676 Sudoku(dfs)
- 异常、File文件、IO流基础分析
- MFC源代码中_afxThreadData的AllocSlot()函数在分配一个槽时可能会覆盖一个已使用的槽 [问题点数
- 程序员的自我修养--代码总结
- UVA 1152 数组和
- 网络编程(20)—— 广播的编程实现
- ARM Options
- (译)LearnOpenGL实际案例Breakout(八):粒子
- js绑定事件