poj--2676 Sudoku(dfs)
2016-10-23 08:44
239 查看
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 EXMY freopen("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 EXMY freopen("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; } } }
相关文章推荐
- 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-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)
- [DFS]poj 2676 Sudoku 数独问题
- poj 2676 sudoku dfs
- POJ 2676 Sudoku dfs