递归回溯实现
退出条件全部遍历结束
// 全部结束
if (count == 81): # 递归出口
return True
// 已经填充过了
# 行优先遍历
row = count // 9 # 行标
col = count % 9 # 列标
if matrix[row][col] != 0: # 已填充
return solveSudoku(matrix, count=count + 1)
递归
for i in range(1, 10):
if check(matrix, row, col, i): # 找到可能的填充数
matrix[row][col] = i
if solveSudoku(matrix, count=count + 1): # 是否可完成
return True # 可完成
# 不可完成
matrix[row][col] = 0 # 回溯
return False # 不可完成
每个数字检查
- 每一行包含1~9
- 每列包含1~9
- 3 *3 区域包含 1~9
def check(matrix, row, col, value):
"""
检测在(row,col)放value是否合适
1.每行含1-9,不含重复值value
2.每列含1-9,不含重复值value
3.3*3区块含1-9,不含重复值value
"""
# 检测每行
for j in range(9):
if matrix[row][j] == value:
return False
# 检测每列
for i in range(9):
if matrix[i][col] == value:
return False
# 检测元素所在3*3区域
area_row = (row // 3) * 3
area_col = (col // 3) * 3
for i in range(area_row, area_row + 3):
for j in range(area_col, area_col + 3):
if matrix[i][j] == value:
return False
return True
整体代码
点击查看代码
def check(matrix, row, col, value):
"""
检测在(row,col)放value是否合适
1.每行含1-9,不含重复值value
2.每列含1-9,不含重复值value
3.3*3区块含1-9,不含重复值value
"""
# 检测每行
for j in range(9):
if matrix[row][j] == value:
return False
# 检测每列
for i in range(9):
if matrix[i][col] == value:
return False
# 检测元素所在3*3区域
area_row = (row // 3) * 3
area_col = (col // 3) * 3
for i in range(area_row, area_row + 3):
for j in range(area_col, area_col + 3):
if matrix[i][j] == value:
return False
return True
def solveSudoku(matrix, count=0):
"""
遍历每一个未填元素,遍历1-9替换为合适的数字
"""
if (count == 81): # 递归出口
return True
# 行优先遍历
row = count // 9 # 行标
col = count % 9 # 列标
if matrix[row][col] != 0: # 已填充
return solveSudoku(matrix, count=count + 1)
for i in range(1, 10):
if check(matrix, row, col, i): # 找到可能的填充数
matrix[row][col] = i
if solveSudoku(matrix, count=count + 1): # 是否可完成
return True # 可完成
# 不可完成
matrix[row][col] = 0 # 回溯
return False # 不可完成
if __name__ == '__main__':
matrix = [[0 for x in range(81)][i:i + 9] for i in range(0, 81, 9)]
solveSudoku(matrix)
for i in range(9):
print(' '.join(map(str, matrix[i])))
原文地址:http://www.cnblogs.com/guanchaoguo/p/16852821.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性