[LeetCode] Sudoku Solver 解数独,递归,回溯
2014-12-03 23:57
423 查看
Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character
You may assume that there will be only one unique solution.
View Code
Empty cells are indicated by the character
'.'.
You may assume that there will be only one unique solution.
#include <vector> #include <iostream> #include <iterator> using namespace std; class Solution { public: void solveSudoku(vector<vector<char> > &board) { help(board,0,0,0,0); } bool help(vector<vector<char> > & board,int i,int ii,int j,int jj){ for(;i<9;i+=3){ for(;ii<3;ii++){ for(;j<9;j+=3){ for(;jj<3;jj++){ if(board[i+ii][j+jj]!='.') continue; bool finish = false; for(char c='1';c<='9'&&!finish;c++){ bool canIn= true; for(int k=0;k<9&&canIn;k++){ if(k!=i+ii&&board[k][j+jj]==c) canIn = false; if(k!=j+jj&&board[i+ii][k]==c) canIn = false; } for(int ti=0;ti<3&&canIn;ti++){ if(ti == ii) continue; for(int tj=0;tj<3&&canIn;tj++){ if(tj==jj) continue; if(board[ti+i][tj+j]==c) canIn = false; } } if(canIn==false) continue; board[i+ii][j+jj] = c; finish = help(board,i,ii,j,jj); } if(!finish){ board[i+ii][j+jj] = '.'; return false; } } jj = 0; } j=0; } ii=0; } return true; } }; int main() { vector<char> line; vector<vector<char> > board; line = {'5','3','.','.','7','.','.','.','.'}; board.push_back(line); line.clear(); line = {'6','.','.','1','9','5','.','.','.'}; board.push_back(line); line.clear(); line = {'.','9','8','.','.','.','.','6','.'}; board.push_back(line); line.clear(); line = {'8','.','.','.','6','.','.','.','3'}; board.push_back(line); line.clear(); line = {'4','.','.','8','.','3','.','.','1'}; board.push_back(line); line.clear(); line = {'7','.','.','.','2','.','.','.','6'}; board.push_back(line); line.clear(); line = {'.','6','.','.','.','.','2','8','.'}; board.push_back(line); line.clear(); line = {'.','.','.','4','1','9','.','.','5'}; board.push_back(line); line.clear(); line = {'.','.','.','.','8','.','.','7','9'}; board.push_back(line); Solution sol; sol.solveSudoku(board); for(int i=0;i<board.size();i++){ copy(board[i].begin(),board[i].end(),ostream_iterator<char>(cout," ")); cout<<endl; } return 0; }
View Code
相关文章推荐
- LeetCode 37. Sudoku Solver(数独Ⅱ)
- LeetCode:Valid Sudoku,Sudoku Solver(数独游戏)
- LeetCode-37-Sudoku Solver, list转字符串join,回溯
- LeetCode 37 Sudoku Solver 回溯和深度遍历 还要学习
- leetcode之深搜递归回溯类之排列与组合类-----77/39/40/216/317 组合 78/90/368 子排列 22/79/93/131 典型递归回溯 46/47 全排列
- [LeetCode] [数独问题] Sudoku Solver
- LeetCode:Valid Sudoku,Sudoku Solver(数独游戏)
- 数独游戏(leetcode) dfs 回溯
- LeetCode 22:Generate Parentheses的递归,回溯两种解法
- Leetcode|Combination Sum II[递归回溯]
- leetcode Combination Sum III-回溯|递归
- leetcode 22. Generate Parentheses-回溯|递归
- [LeetCode 37] Sudoku Solver回溯解法
- leetcode--递归、回溯和分治
- LeetCode 17. Letter Combinations of a Phone Number 递归回溯法
- LeetCode:Valid Sudoku,Sudoku Solver(数独游戏)
- 51.leetcode N-Queens(hard)[递归回溯剪枝]
- C# 数独游戏 递归,回溯,验证是否满足数独
- Sudoku Solver 破解数独 @LeetCode 附DFS感想
- 数独游戏求解(递归+回溯)