写点什么

[Day43]-[回溯]- 解数独

作者:方勇(gopher)
  • 2022 年 5 月 19 日
  • 本文字数:1202 字

    阅读完需:约 4 分钟

37. 解数独

编写一个程序,通过填充空格来解决数独问题。

数独的解法需 遵循如下规则

  1. 数字 1-9 在每一行只能出现一次。

  2. 数字 1-9 在每一列只能出现一次。

  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

数独部分空格内已填入了数字,空白格用 '.' 表示。

 

示例 1:


输入: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"]]解释:输入的数独如上图所示,唯一有效的解决方案如下所示:

复制代码



题解:

func TestSolveSudoku(t *testing.T) {	var m = 9                                        // 9x9 的格子	var board [][]byte                               // 数独	var isValid func(row, col int, target byte) bool // 是否合法	var traceback func(row, col int) bool            // 回溯
isValid = func(row, col int, target byte) bool { for i := 0; i < m; i++ { if board[row][i] == target { // 同一行不能重复 return false } if board[i][col] == target { // 同一列不能重复 return false } if board[row/3*3+i/3][col/3*3+i%3] == target { //3x3区域不能重复 return false } } return true }
// 初始化棋盘 func() { board = make([][]byte, m) for i := 0; i < m; i++ { board[i] = make([]byte, m) } for i := 0; i < m; i++ { for j := 0; j < m; j++ { board[i][j] = '.' } } }()
traceback = func(row, col int) bool { if col == m { return traceback(row+1, 0)
} if row == m { return true } if board[row][col] != '.' { return traceback(row, col+1) }
for i := '1'; i <= '9'; i++ { if !isValid(row, col, byte(i)) { continue } board[row][col] = byte(i) if traceback(row, col+1) { return true } board[row][col] = '.' } return false } traceback(0, 0) for i := 0; i < m; i++ { fmt.Println() for j := 0; j < m; j++ { fmt.Print(string(board[i][j])) } }}
复制代码


用户头像

Dead or Alive. 生存战斗是知识的源泉! 2018.11.08 加入

我是一名SRE哨兵,目前是好大夫基础架构部高级工程师。专注于 SRE,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!

评论

发布
暂无评论
[Day43]-[回溯]-解数独_LeetCode_方勇(gopher)_InfoQ写作社区