Python数独回溯算法运行报TypeError: cannot unpack non-iterable int object问题
问题原因及解决方法
1 报错直接原因
你的find_empty_box函数返回值逻辑错误:
- 当前函数逻辑是检查第一个格子
grid[0][0],如果等于0就返回(x,y)元组,否则直接返回整数0。你试图把单个整数0赋值给row, col两个变量,自然触发「无法解包非可迭代整数对象」的报错。 - 同时函数遍历逻辑完全错误:内层循环的else分支不应该直接return,应该遍历完所有格子都没找到空(也就是没有0)的时候,再返回
None, None匹配你后续if row is None的判断。
2 附带逻辑错误
你的Answer_Valid函数缩进错误:return True现在写在3x3宫行循环的内部,等于只检查了宫的第一行就直接返回True,后续两行根本没检查,会导致数独验证逻辑失效。
修正后的完整代码
import numpy as np grid = [[5,3,0,0,7,0,0,0,0], [6,0,0,1,9,5,0,0,0], [0,9,8,0,0,0,0,6,0], [8,0,0,0,6,0,0,0,3], [4,0,0,8,0,3,0,0,1], [7,0,0,0,2,0,0,0,6], [0,6,0,0,0,0,2,8,0], [0,0,0,4,1,9,0,0,5], [0,0,0,0,8,0,0,7,9]] print(np.matrix(grid)) def find_empty_box(puzzle): for x in range(9): for y in range(9): if puzzle[x][y] == 0: return x, y # 遍历完所有格子都没找到空值,返回None匹配后续判断 return None, None def Answer_Valid(puzzle, guess, row, col): row_values = puzzle[row] if guess in row_values: return False column_values = [puzzle[i][col] for i in range(9)] if guess in column_values: return False row_start = (row // 3) * 3 col_start = (col // 3) * 3 for x in range(row_start, row_start + 3): for y in range(col_start, col_start + 3): if puzzle[x][y] == guess: return False # 所有检查都通过再返回True,缩进放到循环外面 return True def Solver(puzzle): row, col = find_empty_box(puzzle) if row is None: return True for guess in range(1,10): if Answer_Valid(puzzle, guess, row, col): puzzle[row][col] = guess if Solver(puzzle): return True puzzle[row][col] = 0 return False print(Solver(grid)) print(np.matrix(grid))
内容的提问来源于stack exchange,提问作者HiddenSquid123
相关产品推荐
相关产品推荐

