回溯 递归 的回退状态

func solveSudoku(board [][]byte) {
    var line, column [9][9]bool
    var block [3][3][9]bool
    var spaces [][2]int
    for i, row := range board {
        for j, b := range row {
            if b == '.' {
                spaces = append(spaces, [2]int{i, j})
            } else {
                digit := b - '1'
                line[i][digit] = true
                column[j][digit] = true
                block[i/3][j/3][digit] = true
            }
        }
    }
    var dfs func(int) bool
    dfs = func(pos int) bool {
        if pos == len(spaces) {
            return true
        }
        i, j := spaces[pos][0], spaces[pos][1]
        for digit := byte(0); digit < 9; digit++ {
            if !line[i][digit] && !column[j][digit] && !block[i/3][j/3][digit] {
                line[i][digit] = true
                column[j][digit] = true
                block[i/3][j/3][digit] = true
                board[i][j] = digit + '1'
                if dfs(pos + 1) {
                    return true
                }
                line[i][digit] = false
                column[j][digit] = false
                block[i/3][j/3][digit] = false
            }
        }
        return false
    }
    dfs(0)
}

/*
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)
. 46
/ 47
0 48
9 57
*/
/*

37. 解数独 - 力扣(LeetCode) https://leetcode.cn/problems/sudoku-solver/

解数独 - 解数独 - 力扣(LeetCode) https://leetcode.cn/problems/sudoku-solver/solution/jie-shu-du-by-leetcode-solution/


*/

 

posted @ 2022-08-25 21:18  papering  阅读(24)  评论(0编辑  收藏  举报