Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy all of the following rules: 1. Each of the digits
Constraints:
1-9
must occur exactly once in each row. 2. Each of the digits 1-9
must occur exactly once in each column. 3. Each of the digits 1-9
must occur exactly once in each of the 9 3x3
sub-boxes of the grid. The '.'
character indicates empty cells. Example 1: Input: board = [[“5”,”3”,”.”,”.”,”7”,”.”,”.”,”.”,”.”],[“6”,”.”,”.”,”1”,”9”,”5”,”.”,”.”,”.”],[“.”,”9”,”8”,”.”,”.”,”.”,”.”,”6”,”.”],[“8”,”.”,”.”,”.”,”6”,”.”,”.”,”.”,”3”],[“4”,”.”,”.”,”8”,”.”,”3”,”.”,”.”,”1”],[“7”,”.”,”.”,”.”,”2”,”.”,”.”,”.”,”6”],[“.”,”6”,”.”,”.”,”.”,”.”,”2”,”8”,”.”],[“.”,”.”,”.”,”4”,”1”,”9”,”.”,”.”,”5”],[“.”,”.”,”.”,”.”,”8”,”.”,”.”,”7”,”9”]]
Output: [[“5”,”3”,”4”,”6”,”7”,”8”,”9”,”1”,”2”],[“6”,”7”,”2”,”1”,”9”,”5”,”3”,”4”,”8”],[“1”,”9”,”8”,”3”,”4”,”2”,”5”,”6”,”7”],[“8”,”5”,”9”,”7”,”6”,”1”,”4”,”2”,”3”],[“4”,”2”,”6”,”8”,”5”,”3”,”7”,”9”,”1”],[“7”,”1”,”3”,”9”,”2”,”4”,”8”,”5”,”6”],[“9”,”6”,”1”,”5”,”3”,”7”,”2”,”8”,”4”],[“2”,”8”,”7”,”4”,”1”,”9”,”6”,”3”,”5”],[“3”,”4”,”5”,”2”,”8”,”6”,”1”,”7”,”9”]]
Explanation: The input board is shown above and the only valid solution is shown below:
Constraints:
board.length == 9
board[i].length == 9
board[i][j]
is a digit or '.'
. It is guaranteed that the input board has only one solution.题目大意:
日本游戏。需要保证每行每列每个9个方块的数是1-9里唯一。
Global dict解题思路(推荐):
DFS。利用DFS模板
解题步骤:
N/A
注意事项:
- 用三种全局性dict(row, col, box)来记录所有已填的数,方便dfs时候迅速判断是否合法。这是比算法II优胜的地方。Python中不存在list of set只能用list of dict: [collections.defaultdict(int) for _ in range(len(board))]
- 初始化要将棋局上所有已有的数加入到dict中。一开始是dfs时候才加,但这样填的数不知道后面的格是否已经存在。题意保证有解,所以这些数不需验证重复。
- for循环是1-9是数字但棋盘是字符,所以要字符和数字转化,选择统一转成数字,不转的话dict会实效。
- box_dict的id转换: i // 3 * 3 + j // 3
- 终止条件为start_x == len(board) - 1 and start_y == len(board[0])
Python代码:
1 | def solveSudoku(self, board: List[List[str]]) -> None: |
算法分析:
三重循环,时间复杂度为O(9n*n)
,空间复杂度O(n)
,n为边长
常量空间算法II解题思路:
我一开始的方法,每填一位就验证。
Python代码:
1 | def solveSudoku2(self, board: List[List[str]]) -> None: |
算法分析:
三重循环,时间复杂度为O(81n*n)
,空间复杂度O(1)
,n为边长