leetcode 37 Sudoku Solver
2017-10-08 09:35
579 查看
class Solution { public: typedef vector<vector<char> >::size_type sz; typedef set<char>::iterator Sit; void solveSudoku(vector<vector<char>>& board) { sz size = board.size(); // initialize the flags set<char> tmp; for(int i = 1; i < 10; ++i) { tmp.insert('0' + i); } rflag = vector<set<char> >(size, tmp); cflag = vector<set<char> >(size, tmp); bflag = vector<set<char> >(size, tmp); for (sz i = 0; i < size; ++i) { for (sz j = 0; j < size; ++j) { char ch = board[i][j]; if (ch != '.') { rflag[i].erase(ch); cflag[j].erase(ch); bflag[j / 3 * 3 + i / 3].erase(ch); } } } solve(board, 0); return; } private: // mark every row vector<set<char> > rflag; // mark every column vector<set<char> > cflag; // mark every box vector<set<char> > bflag; bool solve(vector<vector<char>>& board, sz ir) { sz size = board.size(); for (sz i = ir; i < size; ++i) { for (sz j = 0; j < size; ++j){ char ch = board[i][j]; if (ch == '.') { set<char> vals(rflag[i]); for (Sit it = vals.begin(); it != vals.end();) { if (cflag[j].find(*it) == cflag[j].end() || bflag[j / 3 * 3 + i / 3].find(*it) == bflag[j / 3 * 3 + i / 3].end()){ // 取共有元素 vals.erase(*it++); } else ++it; } if (vals.empty()) { return false; } for (Sit it = vals.begin(); it != vals.end(); ++it) { board[i][j] = *it; b7e0 rflag[i].erase(*it); cflag[j].erase(*it); bflag[j / 3 * 3 + i / 3].erase(*it); if (solve(board, i) == false) { rflag[i].insert(*it); cflag[j].insert(*it); bflag[j / 3 * 3 + i / 3].insert(*it); } else { return true; } } board[i][j] = '.'; // 标回去 return false; } } } return true; // end } };
参考后
class Solution { public: void solveSudoku(vector<vector<char>>& board) { solve(board, 0); } private: bool solve(vector<vector<char> >& board, size_t r) { size_t size = board.size(); for (size_t i = r; i < size; ++i) { for (size_t j = 0; j < size; ++j) { char ch = board[i][j]; if (ch == '.') { for (int k = 1; k <= 9; ++k) { char val = '0' + k; if (isValid(board, i, j, val)) { board[i][j] = val; if (solve(board, i) == true) return true; } } board[i][j] = '.'; return false; } } } return true; // fill all the empty, all the solve is end } bool isValid(vector<vector<char> >& board, size_t row, size_t col, char c) { size_t size = board.size(); size_t val = 'c' - '0'; for (size_t i = 0; i < size; ++i) { // check row // check column // check block if (board[i][col] == c || board[row][i] == c || board[(row / 3 * 3 + col / 3) / 3 * 3 + i / 3][(row / 3 * 3 + col / 3) % 3 * 3 + i % 3] == c) return false; } return true; } };
相关文章推荐
- Java [leetcode 37]Sudoku Solver
- [LeetCode]37. Sudoku Solver
- LeetCode题目:37. Sudoku Solver
- 【LeetCode】37. Sudoku Solver
- LeetCode 37: Sudoku Solver
- leetcode 37. Sudoku Solver
- LeetCode 37. Sudoku Solver
- leetcode 37. Sudoku Solver
- Leetcode-37-Sudoku Solver(Hard)
- leetcode 36. Valid Sudoku 37. Sudoku Solver
- Leetcode 37. Sudoku Solver
- LeetCode37 Sudoku Solver
- LeetCode_37 Sudoku Solver
- LeetCode-37-Sudoku Solver, list转字符串join,回溯
- LeetCode(37) Sudoku Solver
- LeetCode_37---Sudoku Solver
- LeetCode 37. Sudoku Solver(数读游戏)
- LeetCode 37 Sudoku Solver(求解数独)
- LeetCode 37 Sudoku Solver
- [leetcode-37]Sudoku Solver(java)