python - 更改python列表中的变量(回溯)
问题描述
我正在尝试使用 python 解决数独难题,因为我正在使用 3D 列表、数独板的 2 维和 3 维来存储板上的更改,并且能够在给定单元格不能回溯时回溯填充。我已经编写了一些代码,但遇到了一个我无法弄清楚的问题,每当程序为 3D 列表中的一个单元格分配一个数字时,它也会更改其他单元格中的数字。我的代码如下:
import math
def square_id(grid, ni, nj):
if ni >= 9:
return ("the matrix doesn't have the right size or component doesn't exist")
elif nj >= 9:
return ("the matrix doesn't have the right size or component doesn't exist")
elif ni < 3:
if nj < 3:
return 1
elif nj < 6:
return 2
elif nj < 9:
return 3
elif ni < 6:
if nj < 3:
return 4
elif nj < 6:
return 5
elif nj < 9:
return 6
elif ni < 9:
if nj < 3:
return 7
elif nj < 6:
return 8
elif nj < 9:
return 9
def sudo_rules(grid, ni, nj):
if grid[ni][nj] == 0:
return False
for i in range(0, 9):
if grid[i][nj] == grid[ni][nj] and i != ni:
return False
for j in range(0, 9):
if grid[ni][j] == grid[ni][nj] and j != nj:
return False
for i in range(0, 3):
for j in range(0, 3):
k = square_id(grid, ni, nj)
l = int(math.ceil(k / 3)) - 1
c = k % 3 - 1
if c == -1:
c = 2
if grid[3 * l + i][3 * c + j] == grid[ni][nj] and 3 * c + j != nj and 3 * l + i != ni:
return False
grid0 = [[0, 0, 0, 6, 0, 0, 0, 8, 0],
[0, 4, 0, 0, 0, 0, 0, 2, 0],
[5, 0, 0, 0, 9, 0, 4, 0, 6],
[0, 5, 0, 2, 0, 0, 7, 0, 1],
[9, 0, 0, 0, 0, 3, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 4, 0],
[0, 0, 1, 0, 2, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 8],
[0, 7, 0, 1, 0, 0, 6, 0, 5]]
grid= []
pos = []
for i in range(0, 30):
grid.append([[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0]])
pos.append([1, 0, 0])
grid[0]=grid0
k = 0
i = 0
j = 0
n = 1
while i < 9:
if j == 9:
j = 0
while j < 9:
if sudo_rules(grid[k], i, j) == False:
while n < 11:
if n == 10:
break
print(k, i, j)
print("grid[0]:", grid[0])
grid[k][i][j] = n
print("grid[0]:", grid[0])
print("grid[1]:", grid[1])
if sudo_rules(grid[k], i, j) != False:
pos[k] = [n, i, j]
n = 1
grid[k + 1] = grid[k]
k = k + 1
break
n = n + 1
if k==1:
exit()
if n == 10:
break
j = j + 1
i = i + 1
if n == 10:
print(grid[0])
k = k - 1
n = pos[k][0] + 1
i = pos[k][1]
j = pos[k][2]
for i in range(0, 9):
for j in range(0, 9):
if sudo_rules(grid[k], i, j) == False:
print("Wrong")
break
我的问题出在这一行:
print(k, i, j)
print("grid[0]:", grid[0])
grid[k][i][j] = n
print("grid[0]:", grid[0])
print("grid[1]:", grid[1])
我不明白为什么改变 grid[1][0][1] 也会改变 grid[0][0][1]。任何帮助将不胜感激,谢谢
解决方案
这一行:
grid[k + 1] = grid[k]
看起来您希望它创建网格的副本,但它只是分配分配给的相同网grid[k]
格grid[k + 1]
。
如果您需要某个对象的副本,您可以使用copy()
or deepcopy()
,具体取决于数据结构。
推荐阅读
- angular - Angular API 415(不支持的媒体类型)
- c++ - C++,将double转换为int时遇到问题
- c++ - 如何在 C++ 中将密码和用户名保存到 .txt 文件中。如果用户尝试登录,我仍然希望能够检索它们
- python - 如何编写在第二个函数中将值作为参数返回的 Python 函数
- flutter - Flutter/Dart:使用 setState() 时更新一些变量但不更新其他变量
- java - 弹出菜单没有膨胀
- angular5 - SyntaxError:无法在模块 Angular 5 之外使用导入语句
- sql - 如何使用 sql 查询获取范围落在哪个条件中?
- ocaml - 使用带有元组键的 Base.Hashtbl
- c - C中另一个结构内的结构数组