回溯法 数独问题(sudoku) python
来源:互联网 发布:mac雪花高光粉饼试色 编辑:程序博客网 时间:2024/05/20 02:51
def print_grid(arr): for i in range(9): for j in range(9): # 注意,在py3.x中,print函数默认都有换行 print(arr[i][j], end="") print()# 找出目前没有被赋值的位置,若全部都被填满,则返回Falsedef find_empty_location(arr, l): for row in range(9): for col in range(9): if arr[row][col] == 0: l[0] = row l[1] = col # print("empty: row="+str(row)+" col="+str(col)) return True return False# 找出num在该arr的row行是否出现过def used_in_row(arr, row, num): for i in range(9): if arr[row][i] == num: return True return False# 找出num在该arr的col列是否出现过def used_in_col(arr, col, num): for i in range(9): if arr[i][col] == num: return True return False# 找出num在该arr的3x3-box是否出现过,更应注意的是,传参技巧!def used_in_box(arr, row, col, num): for i in range(3): for j in range(3): if arr[row+i][col+j] == num: return True return Falsedef check_location_is_safe(arr, row, col, num): return not used_in_row(arr, row, num) and not used_in_col(arr, col, num) and not used_in_box(arr, row - row % 3, col - col % 3, num)def solve_sudoku(arr): # 当前搜索的第几行、第几列 l = [0, 0] # 找出还未被填充的位置 if not find_empty_location(arr, l): return True # 未被填充的位置,赋值给row,col row = l[0] col = l[1] for num in range(1, 10): if check_location_is_safe(arr, row, col, num): arr[row][col] = num #print_grid(arr) if solve_sudoku(arr): return True # 若当前num导致未来并没有结果,则当前所填充的数无效,置0后选下一个数测试 arr[row][col] = 0 return Falseif __name__ == "__main__": grid = [[0 for x in range(9)] for y in range(9)] grid = [[3, 0, 6, 5, 0, 8, 4, 0, 0], [5, 2, 0, 0, 0, 0, 0, 0, 0], [0, 8, 7, 0, 0, 0, 0, 3, 1], [0, 0, 3, 0, 1, 0, 0, 8, 0], [9, 0, 0, 8, 6, 3, 0, 0, 5], [0, 5, 0, 0, 9, 0, 6, 0, 0], [1, 3, 0, 0, 0, 0, 2, 5, 0], [0, 0, 0, 0, 0, 0, 0, 7, 4], [0, 0, 5, 2, 0, 6, 3, 0, 0]] if solve_sudoku(grid): print_grid(grid) else: print("No solution exists\n")# output# 3 1 6 5 7 8 4 9 2# 5 2 9 1 3 4 7 6 8# 4 8 7 6 2 9 5 3 1# 2 6 3 4 1 5 9 8 7# 9 7 4 8 6 3 1 2 5# 8 5 1 7 9 2 6 4 3# 1 3 8 9 4 7 2 5 6# 6 9 2 3 5 1 8 7 4# 7 4 5 2 8 6 3 1 9
阅读全文
0 0
- 回溯法 数独问题(sudoku) python
- python学习笔记-利用回溯法求解数独问题
- 数独游戏(sudoku)算法 回溯+剪枝
- (POJ2676)Sudoku <简单数独问题>
- 数独问题(DFS回溯)
- Sudoku 数独问题(dfs)
- 数独(回溯)
- 数独(SuDoku)介绍
- poj2676(数独 sudoku)
- POJ2676-Sudoku(数独)
- 回溯法寻找数独(java)
- hdu 1426 Sudoku Killer(DFS 数独问题)
- Sudoku Solver 数独填充 递归判断回溯
- [LeetCode] [数独问题] Sudoku Solver
- [LeetCode] [数独问题] Valid Sudoku
- [DFS]poj 2676 Sudoku 数独问题
- Sudoku Solver 求解数独问题
- 36/37. Sudoku Solver 数独问题
- 算法提高 幸运顾客
- jquery treeview 简介
- linux 用户和组管理命令
- 私有云落地解决方案之openstack高可用(pike版本)-neutron【ovs】
- 当对输入的数据进行大小排序有浮点数和整数,判断是浮点数还是整型数,按原型输出
- 回溯法 数独问题(sudoku) python
- 解析NULL 为 空字符
- Android Studio 依赖搜索插件GradleDependencyHelper
- JS实现 进度条 不用控件 超级简单
- 基于TCP/UDP的网络聊天程序
- oracle 时间函数整理
- 计划任务crontab
- Spring和AOP之间的详解
- SpringBoot简单入门(一)