我制作了一个程序,使用回溯算法解决4x4数独(网格分为2个部分,也分为2个部分,4个单元格),它有3个功能,首先打印网格,第二个检查数字是否可以放入一个单元格,主要功能(前2个功能按预期工作)。程序工作不正常,我在pythontutor上检查它,发现它返回列表,即使它不应该,例如一个数字被放入列表中,然后一个函数调用自己,如果某些数字不能被放置,那么函数返回,但似乎它也返回list.Here是代码。我知道这个程序有缺陷它效率不高(我也知道要改变什么),但由于同样的原因它不会起作用。
def sudoku(array):
for x in range(2): #loop that iterates through 2 lists
for y in range(2): #loop that iterates through 2 lists inside lists from above
for z in range(4): #loop that iterates through each cell
if array[x][y][z] == 0: #if a cell is empty then we can write numbers in it
for t in range(1, 5): #loop used for writing numbers into the cells
array[x][y][z] = t #line that writes numbers into the cells
rec = check(x, y, z, t, array) #check if a number can be placed
if rec == False: #if it can then
g = sudoku(array) #call the function
if g == True: #if g returns true then a solution is found, stop the program
return True
elif g == False and t == 4: #if g returns false and no number can be written into the next cell, and all numbers were written into the current cell, then return
return False
elif rec == True and t == 4: #if a number cant be placed into the cell and none of the numbers are valid, then return
return False
print_grid(array) #when all loops finish then a solution is found, print the grid
return True #return
array = [[[0, 4, 0, 0], [0, 1, 3, 0]], [[0, 2, 4, 0], [0, 0, 1, 0]]]
答案 0 :(得分:0)
请注意,在您发布的图片中,所有3个框架都指向同一个列表。
在Python中,列表是可变的'。这意味着,您可以修改列表,并且引用该列表的所有变量都将指向更改的列表。
如果您想保留原始列表以便轻松回溯,那么您需要执行“深层复制”。整个清单:
def deep_copy(array):
array_copy = [[[0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0]]]
for x in range(2):
for y in range(2):
for z in range(4):
array_copy[x][y][z] = array[x][y][z]
return array_copy
我们为其他函数(或在本例中为我们自己的函数)提供列表的副本而不是原始函数,以便任何更改只影响副本:
array_copy = deep_copy(array)
g = sudoku(array_copy)