我正在尝试制作一个Python程序来制作解决的数独谜题。它随机生成一个图块的坐标,如果该图块中已有一个数字,它会再次尝试。然后它会生成1到9之间的数字以放在那里,如果该数字不在该行,列或部分中,则它会分配该值并将这些坐标添加到占用的切片列表中。一旦所有瓷砖都被填满,它就应该退出循环并返回完成的网格。
麻烦的是,它在大约70次循环后总是无缘无故地停止,导致程序冻结。
以下是我正在谈论的函数的代码:
def populate(grid):
usedCoords = []
populated = False
while not populated:
x = random.randrange(len(grid))
y = random.randrange(len(grid))
while [x,y] in usedCoords:
x = random.randrange(len(grid))
y = random.randrange(len(grid))
value = random.randrange(1, len(grid) + 1)
if not rowCheck(grid, x, y, value) and not columnCheck(grid, x, y, value) and not squareCheck(grid, x, y, value):
grid[x][y] = value
usedCoords.append([x,y])
print(len(usedCoords))
if len(usedCoords) == len(grid) ** 2:
populated = True
return grid
以下是它引用的函数的代码:
def rowCheck(grid, x, y, value):
for i in range(len(grid)):
if not i == x:
if grid[i][y] == value:
return True
return False
def columnCheck(grid, x, y, value):
for i in range(len(grid)):
if not i==y:
if grid[x][i] == value:
return True
return False
def squareCheck(grid, x, y, value):
grid2 = [0] * (sectionSide) #new grid for the specific section
for i in range(len(grid2)):
grid2[i] = [0] * sectionSide
for i in range(x - (sectionSide - 1), x + sectionSide): #scanning only nearby coordinates
for j in range(y - (sectionSide - 1), y + sectionSide):
try:
if i // sectionSide == x // sectionSide and j // sectionSide == y // sectionSide:
grid2[i][j] = grid[x][y]
except IndexError:
pass
for i in range(len(grid2)):
for j in range(len(grid2[i])):
if grid2[i][j] == value and not (i == x and j == y):
return True
return False
答案 0 :(得分:3)
可能还有其他问题,但代码的一个大问题是,如果它发现它创建了一个无法解决的电路板状态,它就无法回溯。考虑如果您的代码在电路板的前两行放置以下值会发生什么:
1 2 3 4 5 6 7 8 9
4 5 6 7 8 1 2 3
到目前为止所放置的数字都是合法的,但是没有数字可以放在第二行的最后一个空格中。我猜你的代码最终会在它创建一堆这样的董事会职位时陷入困境,这些职位不会带来任何价值。如果它没有合法的移动,它将继续循环。
您需要更复杂的算法来避免此问题。