LeetCode: 37. Sudoku Solver
2017-03-28 08:45
344 查看
LeetCode: 37. Sudoku Solver
题目描述
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.
大意就是说: 已知某个有且仅有唯一解的数独, 让我们写个代码解开它。
解题思路
用 DFS 就可以做出了。这里我们利用 LeetCode: 36. Valid Sudoku 的思路, 对数独进行标记。AC源码
class Solution { public: bool solveSudoku(vector<vector<char>>& board, int i, int j, int flag[][9]) { if(i==9) return true; if(j==9) return solveSudoku(board, i+1, 0, flag); if(board[i][j] != '.') { return solveSudoku(board, i, j+1, flag); } else { for(int digit = 0; digit < 9; ++digit) { int f = flag[0][i] | flag[1][j] | flag[2][i/3*3+j/3]; if(f & (1 << digit)) { continue; } else { // 标记 flag[0][i] |= (1 << digit); flag[1][j] |= (1 << digit); flag[2][i/3*3+j/3] |= (1 << digit); board[i][j] = digit + '1'; if(solveSudoku(board, i, j+1, flag)) return true; // 取消标记 board[i][j] = '.'; flag[0][i] &= ~(1 << digit); flag[1][j] &= ~(1 << digit); flag[2][i/3*3+j/3] &= ~(1 << digit); } } } return false; } void solveSudoku(vector<vector<char>>& board) { int flag[3][9] = {0}; // 0: row, 1: column, 2: rect // 初始化标记 for(int i = 0; i < board.size(); ++i) { for(int j = 0; j < board[i].size(); ++j){ if(board[i][j] != '.') { int value = 1 << (board[i][j] - '0' - 1); if(flag[0][i] & value) return ; else flag[0][i] |= value; if(flag[1][j] & value) return ; else flag[1][j] |= value; int rectIdx = i/3*3 + j/3; if(flag[2][rectIdx]&value) return ; else flag[2][rectIdx] |= value; } } } solveSudoku(board, 0, 0, flag); } };
相关文章推荐
- LeetCode 37 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)
- 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
- Leetcode||37. Sudoku Solver
- LeetCode37 Sudoku Solver