Python数独解算器跳值问题

Python数独解算器跳值问题,python,python-3.x,sudoku,Python,Python 3.x,Sudoku,我正在尝试用Python制作一个数独解算器 其思想是针对每个值,如果其0表示为空,则在正方形、x和y行中查找数字 然后在范围(1,10)中应用for循环,如果该值不在找到的数字列表中,则将该值更改为0 但是,程序会跳过一些空白值 例如: [[8, 1, 0, 0, 3, 0, 0, 2, 7], [0, 6, 2, 0, 5, 0, 0, 9, 0], [0, 7, 0, 0, 0, 0, 0, 0, 0], [0, 9, 0, 6, 0, 0, 1, 0, 0], [1, 0, 0, 0, 2

我正在尝试用Python制作一个数独解算器

其思想是针对每个值,如果其0表示为空,则在正方形、x和y行中查找数字

然后在范围(1,10)中应用for循环,如果该值不在找到的数字列表中,则将该值更改为0

但是,程序会跳过一些空白值

例如:

[[8, 1, 0, 0, 3, 0, 0, 2, 7],
[0, 6, 2, 0, 5, 0, 0, 9, 0],
[0, 7, 0, 0, 0, 0, 0, 0, 0],
[0, 9, 0, 6, 0, 0, 1, 0, 0],
[1, 0, 0, 0, 2, 0, 0, 0, 4],
[0, 0, 8, 0, 0, 5, 0, 7, 0],
[0, 0, 0, 0, 0, 0, 0, 8, 0],
[0, 2, 0, 0, 1, 0, 7, 5, 0],
[3, 8, 0, 0, 7, 0, 0, 4, 2]]
此输入提供以下信息:

[8, 1, 4, 9, 3, 6, 5, 2, 7]
[0, 6, 2, 1, 5, 4, 3, 9, 8]
[5, 7, 3, 2, 8, 0, 4, 1, 6]
[2, 9, 5, 6, 4, 3, 1, 0, 0]
[1, 3, 6, 7, 2, 8, 9, 0, 4]
[4, 0, 8, 0, 9, 5, 2, 7, 3]
[6, 4, 1, 3, 0, 2, 0, 8, 9]
[9, 2, 0, 4, 1, 0, 7, 5, 0]
[3, 8, 0, 5, 7, 9, 6, 4, 2]
我不明白原因。我的代码在这里:

class数独:
数独=[[8,1,0,0,3,0,0,2,7],
[0, 6, 2, 0, 5, 0, 0, 9, 0],
[0, 7, 0, 0, 0, 0, 0, 0, 0],
[0, 9, 0, 6, 0, 0, 1, 0, 0],
[1, 0, 0, 0, 2, 0, 0, 0, 4],
[0, 0, 8, 0, 0, 5, 0, 7, 0],
[0, 0, 0, 0, 0, 0, 0, 8, 0],
[0, 2, 0, 0, 1, 0, 7, 5, 0],
[3, 8, 0, 0, 7, 0, 0, 4, 2]]
def find_square(自身、x行、y行):
方形列表=[]
如果第2行和第5行:
线y=6
如果第_x 2行和第_x 5行:
线_x=6
对于范围(0,3)内的i:
对于范围(0,3)内的j:
list=self.sudoku[line_y+i]
如果列表[行x+j]!=0:
追加(列表[行x+j])
返回方格表
def find_x(自身,行_x):
临时清单=[]
对于self.sudoku中的行:
如果行[line_x]!=0:
临时列表。追加(第[x]行)
返回临时列表
def find_y(自身,行):
临时清单=[]
对于我自己来说,数独[line_y]:
如果我0:
临时清单。附加(i)
返回临时列表
def取数(自身、x行、y行):
临时清单=[]
列表=[]
对于我在self.find_square(x行,y行):
临时清单。附加(i)
对于我在self.find_x(第_x行):
临时清单。附加(i)
对于我自己。查找y(第y行):
临时清单。附加(i)
对于临时清单中的i:
如果我不在列表中:
列表.附加(i)
返回列表
def解算(自):
对于范围(9)内的y:
对于范围(9)内的x:
如果self.sudoku[y][x]==0:
列表=自身。取数字(x,y)
对于范围(1,10)内的i:
如果我不在列表中:
self.sudoku[y][x]=i
打破
def print_数独(self):
对于self.sudoku中的i:
印刷品(一)
测试=数独
test.solve()
test.print_sudoku()

对变量使用名称
list
是个坏主意,因为您正在替换内置类型
list
(我认为Pythoin中应该有一个初学者模式,在运行代码时自动标记这些内容,但这是另一个主题)-我发现将包含列表的变量的名称改为复数很有帮助,在末尾加上s,我建议将
list
的用法改为例如
numbers
,然后你可以使用例如
对numbers in numbers进行迭代:
我认为结果中的0是你的“solve()`函数未找到解决方案-您的代码似乎根本无法处理此问题。这可能是您提高自己调试技能的一个机会。下面的文章提供了几种有用的调试技术。对变量使用名称
list
是个坏主意,因为您正在替换内置类型
list
(我认为Pythoin中应该有一个初学者模式,在运行代码时会自动标记这些内容,但这是另一个主题)-我发现将包含列表的变量的名称改为复数很有帮助,在末尾加上s,我建议将
list
的用法改为例如
numbers
,然后你可以使用例如
对numbers in numbers进行迭代:
我认为结果中的0是你的“solve()`函数未找到解决方案-您的代码似乎根本无法处理此问题。这可能是您提高自己调试技能的一个机会。下面的文章提供了几种有用的调试技术。