数独算法(非递归)

 

这是一个比较好的数独生成程序,没有采用递归,复杂度也比较低。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是一个基于回溯算法Python 数独求解程序: ```python def solveSudoku(board): """ :type board: List[List[str]] :rtype: void """ def isValid(row, col, val): for i in range(9): if board[row][i] == val or board[i][col] == val or \ board[3*(row//3)+i//3][3*(col//3)+i%3] == val: return False return True def backtrack(): nonlocal solved for i in range(9): for j in range(9): if board[i][j] == ".": for k in range(1, 10): if isValid(i, j, str(k)): board[i][j] = str(k) backtrack() if solved: return board[i][j] = "." return solved = True solved = False backtrack() ``` 其中,`board` 是一个 9x9 的二维字符数组,代表数独的初始状态。算法的核心是 `backtrack` 函数,它通过暴力枚举每个空格的可能取值,递归地搜索解空间,并在找到第一个可行解后返回。`isValid` 函数用于判断当前位置填入的数字是否合法。 使用方法如下: ```python 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"] ] solveSudoku(board) print(board) ``` 输出结果为: ``` [ ["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"] ] ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值