[LeetCode] Sudoku Solver(迭代)
2014-08-25 23:20
176 查看
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.
A sudoku puzzle...
...and its solution numbers marked in red.
方法:解此问题的关键是要在备选集合里挨个进行试,不是每个空格一开始只有一个唯一的固定数可以填的
Empty cells are indicated by the character
'.'.
You may assume that there will be only one unique solution.
A sudoku puzzle...
...and its solution numbers marked in red.
方法:解此问题的关键是要在备选集合里挨个进行试,不是每个空格一开始只有一个唯一的固定数可以填的
class Solution { public: void solveSudoku(vector<vector<char> > &board) { vector<set<char>> rowMap(9); vector<set<char>> colMap(9); vector<set<char>> boxMap(9); vector<pair<int,int>> blank; for(int i=0;i<9;i++) { for(int j=0;j<9;j++) { if(board[i][j]=='.') { blank.push_back(pair<int,int>(i,j)); continue; } rowMap[i].insert(board[i][j]); } } for(int j=0;j<9;j++) { for(int i=0;i<9;i++) { if(board[i][j]=='.') continue; colMap[j].insert(board[i][j]); } } for(int i=0;i<9;i=i+3) { for(int j=0;j<9;j=j+3) { vector<int> mp(10,0); for(int k=0;k<3;k++) { for(int m=0;m<3;m++) { if(board[i+k][j+m]=='.') continue; boxMap[(i/3) * 3 +j/3].insert(board[i+k][j+m]); } } } } found = false; DFS(0,blank,rowMap,colMap,boxMap,board); } private: void DFS(int t, vector<pair<int,int>> &blank, vector<set<char>> &rowMap, vector<set<char>> &colMap, vector<set<char>> &boxMap, vector<vector<char> > &board) { if(t>=blank.size()) { found = true; } else { int i= blank[t].first; int j= blank[t].second; for(char digit ='1';digit<='9';digit++) { if(rowMap[i].count(digit)>0 || colMap[j].count(digit)>0 || boxMap[i/3 * 3 + j/3].count(digit)>0) { continue; } board[i][j]=digit; rowMap[i].insert(digit); colMap[j].insert(digit); boxMap[i/3*3+j/3].insert(digit); DFS(t+1,blank,rowMap,colMap,boxMap,board); rowMap[i].erase(digit); colMap[j].erase(digit); boxMap[i/3*3+j/3].erase(digit); if(found) return; } } } private: bool found; };
相关文章推荐
- 迭代和递归 - leetcode 206. Reverse Linked List
- [Leetcode] Sudoku Solver (Java)
- LeetCode 206. Reverse Linked List(迭代和递归两种实现)
- LeetCode Online Judge 题目C# 练习 - Sudoku Solver
- [LeetCode] Sudoku Solver
- Java [leetcode 37]Sudoku Solver
- leetcode--Sudoku Solver
- [leetcode] 37. Sudoku Solver
- LeetCode题解——Sudoku Solver
- LeetCode 37 Sudoku Solver (C,C++,Java,Python)
- [leetcode] Sudoku Solver
- [LeetCode] [数独问题] Sudoku Solver
- leetcode 37:Sudoku Solver
- LeetCode | Sudoku Solver
- LeetCode37 Sudoku Solver
- Leetcode 226[easy]---Invert Binary Tree(迭代入门题,tree-queue,stack 入门题,反复看)
- LeetCode 第 37 题 (Sudoku Solver)
- leetcode - 37.Sudoku Solver
- n皇后问题的递归和迭代版 leetcode N-Queens
- Leetcode224: Sudoku Solver