如何解决Python Sudoku Solver进入无限循环,如何限制函数中的循环次数?
但是,我正在努力了解如何限制打印出的解决方案的数量而不影响函数的迭代方式。
我尝试在solve()
函数内部使用一个while循环,但这没用。
import numpy as np
# Add the puzzle you want to solve here:
grid = [[0,3,4],[0,6,5],2,1],[3,4,0],[2,[6,5,0]
]
def possible(y,x,n):
global grid
for i in range(0,6):
if grid[y][i] == n:
return False
for i in range(0,6):
if grid[i][x] == n:
return False
x0 = (x//3)*3
y0 = (y//3)*3
for i in range(0,3):
for j in range(0,3):
if grid[y0+i][x0+j] == n:
return False
return True
print(np.matrix(grid))
def solve():
global grid
for y in range(6):
for x in range(6):
if grid[y][x] == 0:
for n in range(1,10):
if possible(y,n):
grid[y][x] = n
solve()
grid[y][x] = 0
return
print(np.matrix(grid))
解决方法
每次调用solve()
时,它将从第一个方框i,j = 0,0
开始。因此,如果您的possible
函数针对某些坐标返回False
,则永远不要将值更改为不同于0的值,并且将永远停留在该特定框上。
如果您仍然想实现递归函数,则至少需要传递坐标i
和j
作为参数。
我将在这里尝试为可能的方法进行推理。
对于possible()
的正确性我不能说太多(这很重要,因为它可以正常工作,否则它可能是一个永不终止的算法)。另一方面,在我看来,假设possible()
是正确的,则该算法具有上限(由于使用range()的循环)并且自给定的sudoku(即使没有线索)总是有一个有限的解集,那么您的算法应该总是终止。因此,最好对某些输入集有时间复杂度的期望。
一种可能的方法是限制递归深度(请参阅更多here),或者将参数传递给solve(limit=1000)
,每次您递归更深时递减,然后将其与布尔条件组合,例如,大约找到了(部分)解决方案(通常在这种问题上,解决方案验证是最容易的部分)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。