POJ 2676 sudoku
2013-08-22 09:27
302 查看
数独问题。给定其中的几个数,找出其他符合规则的数。保证所给数据合法。典型的DFS。 又是1A真爽。
首先用三个数组标记每列每行每个九宫格出现过的数字。然后DFS寻找可能的状态。跑了400+ms。
首先用三个数组标记每列每行每个九宫格出现过的数字。然后DFS寻找可能的状态。跑了400+ms。
#include <iostream> #include <algorithm> #include <cstdlib> #include <cstring> #include <cstdio> using namespace std; int sudoku[10][10]; bool MarkDfs,hr[10][10],hc[10][10],hs[10][10]; int JudgeS(int i,int j) { if(1 <= i && i <= 3 && 1 <= j && j <= 3) return 1; if(1 <= i && i <= 3 && 4 <= j && j <= 6) return 2; if(1 <= i && i <= 3 && 7 <= j && j <= 9) return 3; if(4 <= i && i <= 6 && 1 <= j && j <= 3) return 4; if(4 <= i && i <= 6 && 4 <= j && j <= 6) return 5; if(4 <= i && i <= 6 && 7 <= j && j <= 9) return 6; if(7 <= i && i <= 9 && 1 <= j && j <= 3) return 7; if(7 <= i && i <= 9 && 4 <= j && j <= 6) return 8; if(7 <= i && i <= 9 && 7 <= j && j <= 9) return 9; } void dfs(int r,int c) { if(MarkDfs == false) return; int i,j,k; for(i = r;i <= 9; ++i) { for(j = (i == r ? c : 1);j <= 9; ++j) { if(sudoku[i][j] == 0) { for(k = 1;k <= 9; ++k) { if(hr[i][k] == false && hc[j][k] == false && hs[JudgeS(i,j)][k] == false) { hr[i][k] = true; hc[j][k] = true; hs[JudgeS(i,j)][k] = true; sudoku[i][j] = k; dfs(i,j); if(MarkDfs) { sudoku[i][j] = 0; hr[i][k] = false; hc[j][k] = false; hs[JudgeS(i,j)][k] = false; } } } return ; } } } MarkDfs = false; } int main() { int T; int i,j; scanf("%d",&T); while(T--) { memset(hr,false,sizeof(hr)); memset(hc,false,sizeof(hc)); memset(hs,false,sizeof(hs)); MarkDfs = true; for(i = 1;i <= 9; ++i) { for(j = 1;j <= 9; ++j) scanf("%1d",&sudoku[i][j]); } for(i = 1; i <= 9; ++i) { for(j = 1;j <= 9; ++j) { hr[i][sudoku[i][j]] = true; hc[j][sudoku[i][j]] = true; hs[JudgeS(i,j)][sudoku[i][j]] = true; } } dfs(1,1); for(i = 1;i <= 9; ++i) { for(j = 1;j <= 9; ++j) { printf("%d",sudoku[i][j]); } printf("\n"); } } return 0; }
相关文章推荐
- POJ 2676 Sudoku
- poj 2676 Sudoku (dfs)
- POJ 2676 Sudoku
- POJ 2676 Sudoku(经典DFS)
- POJ 2676 Sudoku
- POJ 2676 Sudoku 笔记
- Poj 2676 Sudoku
- poj-2676 Sudoku
- poj 2676 Sudoku
- POJ 2676 Sudoku 数独
- POJ_2676_Sudoku
- Sudoku(POJ 2676)
- POJ 2676 Sudoku
- POJ 2676 Sudoku (数独 DFS)
- POJ 2676 Sudoku
- POJ 2676-Sudoku(DFS)
- poj_2676 Sudoku(dfs)
- POJ 2676 Sudoku(数独)__深搜
- poj 2676 Sudoku DLX
- 【POJ】2676 Sudoku