编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则 :
- 数字
1-9在每一行只能出现一次。 - 数字
1-9在每一列只能出现一次。 - 数字
1-9在每一个以粗实线分隔的3x3宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用'.'表示。
示例:
输入: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"]]输出:[["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"]]解释:输入的数独如上图所示,唯一有效的解决方案如下所示:<img src=" https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2021/04/12/250px-sudoku-by-l2g-20050714_solutionsvg.png" style="height:250px; width:250px" />
提示:
board.length == 9board[i].length == 9board[i][j]是一位数字或者'.'-
解法一:回溯
function solveSudoku(board: string[][]): void {let n = 9let rows: Array<Set<string>> = new Array(n).fill(false).map(() => new Set())let cols: Array<Set<string>> = new Array(n).fill(false).map(() => new Set())let blocks: Array<Set<string>> = new Array(n).fill(false).map(() => new Set())// 获取当前属于第几个块const getBlockNum = (x:number, y:number) => Math.floor(x / 3) + Math.floor(y / 3) * 3for (let i = 0; i < n ; i++) {for (let j = 0; j < n; j++) {rows[i].add(board[i][j])cols[j].add(board[i][j])blocks[getBlockNum(i,j)].add(board[i][j])}}const recursion = (x: number, y:number): boolean => {if (x === 9) {y++x = 0if (y === 9) {return true}}if (board[x][y] !== '.') {return recursion(x + 1, y)}for (let i = 1; i <= 9; i++) {const tmp = i + ""if (rows[x].has(tmp) || cols[y].has(tmp) || blocks[getBlockNum(x, y)].has(tmp)) {continue}board[x][y] = tmprows[x].add(tmp)cols[y].add(tmp)blocks[getBlockNum(x,y)].add(tmp)if (recursion(x+1, y)) {return true}rows[x].delete(tmp)cols[y].delete(tmp)blocks[getBlockNum(x,y)].delete(tmp)board[x][y] = "."}return false}recursion(0,0)return};
