POJ 2676 sudoku dfs
2014-12-10 19:51
369 查看
题意:数独游戏,用1-9个数字填满9 * 9 的格子,让每行,每列,每个小的3 * 3 格子都有唯一的一个数字。
思路:简单的dfs。
代码如下:
思路:简单的dfs。
代码如下:
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; char sudoku[9][20]; bool rows[9][10]; bool columns[9][10]; bool blocks[9][10]; bool dfs(int n) { if(n == 81) return true; int x = n / 9, y = n % 9; int id = x / 3 * 3 + y / 3; if(sudoku[x][y] != 0) return dfs(n+1); else{ for(int i = 1; i <= 9; ++i){ if(!rows[x][i] && !columns[y][i] && ! blocks[id][i]){ rows[x][i] = columns[y][i] = blocks[id][i] = true; sudoku[x][y] = i; if(dfs(n+1)) return true; rows[x][i] = columns[y][i] = blocks[id][i] = false; sudoku[x][y] = 0; } } } return false; } int main(void) { //freopen("in","r",stdin); int T; scanf("%d",&T); while(T--){ memset(rows,0,sizeof(rows)); memset(columns,0,sizeof(columns)); memset(blocks,0,sizeof(blocks)); for(int i = 0; i < 9; ++i) scanf("%s",sudoku[i]); for(int i = 0; i < 9; ++i){ for(int j = 0; j < 9; ++j){ sudoku[i][j] -= '0'; if(sudoku[i][j] != 0){ rows[i][sudoku[i][j]] = true; columns[j][sudoku[i][j]] = true; blocks[i / 3 * 3 + j / 3][sudoku[i][j]] = true; } } } dfs(0); for(int i = 0; i < 9; ++i) for(int j = 0; j < 9; ++j) sudoku[i][j] += '0'; for(int i = 0; i < 9; ++i) printf("%s\n",sudoku[i]); } return 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 2676 Sudoku(dfs)
- POJ-2676-Sudoku-DFS
- poj 2676 sudoku ( 数独)----DFS
- POJ 2676-Sudoku(DFS-数独)
- POJ 2676-Sudoku(DFS)
- [DFS]poj 2676 Sudoku 数独问题
- poj dfs之2676 Sudoku
- POJ-2676 Sudoku(DFS)
- DFS POJ 2676 Sudoku
- POJ 2676 Sudoku (DFS回溯剪枝)