我遇到一个试图解决数独的简单代码的问题。我在这里跳过有关我用来解决数独的方法的细节。我认为目前唯一重要的事情是:当算法被卡住时(例如,因为我们在数独中找不到更多的数字)我调用了一个搜索框的函数,其中空的,只能包含两个可能的数字。然后该函数获取两个候选者之间的最大数字,并将其替换为空框。然后我要求代码尝试使用这个新数字来解决数独。显然,我想在替换我的猜测之前保存数独矩阵的备份副本。问题出现了......当我修改数独矩阵时,备份副本也会被修改。目前我还没有找到任何解决方案。 为了更清楚,我在下面报告了提出问题的代码的简化版本:
from pylab import *
data= loadtxt('bla.txt')
matrix= []
for i in range(0,len(data)):
raw=[]
for j in range(0,len(data)):
if i==0 and j==0:
raw.append([data[i][j],1,3])
else:
raw.append([data[i][j],1,2,3,4,5,6,7,8,9])
matrix.append(raw)
def cancella(i,j,matrix):
numero= matrix[i][j][0]
for k in range(0,len(matrix)):
if matrix[i][k][0]==0. and numero in matrix[i][k]:
matrix[i][k].pop(matrix[i][k].index(numero))
if matrix[k][j][0]==0. and numero in matrix[k][j]:
matrix[k][j].pop(matrix[k][j].index(numero))
return matrix
candidati=[]
indice1=[]
indice2=[]
backup=[]
matrix=asarray(matrix)
sudoku=matrix.copy()
matrix=matrix.tolist()
sudoku=sudoku.tolist()
backup.append(sudoku)
for i in range(0,len(matrix)):
bandiera= False
for j in range(0,len(matrix)):
if matrix[i][j][0]==0. and len(matrix[i][j])==3.:
candidati.append(matrix[i][j][1])
candidati.append(matrix[i][j][2])
indice1.append(i)
indice2.append(j)
matrix[i][j][0]= matrix[i][j][2]
matrix= cancella(i,j,matrix)
bandiera= True
break
if bandiera:
break
print backup, matrix
简单地说,例程" cancella"每次在框中插入新号码时都会调用。此功能会删除包装盒中的数字和原始口袋。代码的第一个原始数据加载存储数独矩阵的.txt文件。我故意在这里修改了第一个矩阵的项目,即矩阵[0] [0],以便有一个只有两个可能的候选者的盒子,这就是我在消息开头所指的情况。 如果您尝试运行代码,您将看到备份和矩阵没有区别,因此矩阵中的修改也已记录在备份中,这不是我喜欢的。我想保留矩阵的备份副本并修改矩阵而不修改其备份副本。
我想问一下是否有人知道如何解决这个问题。 感谢所有人的关注。 安德烈
P.S。 bla.txt文件包含以下形式的数独矩阵。例如:
0 1 0 1 0 0 0 4 0
1 0 0 0 0 0 0 8 0
4 0 0 0 0 0 0 3 0
0 0 0 4 9 7 5 0 3
0 3 7 0 5 0 2 0 4
0 0 0 2 0 0 0 7 0
0 6 0 0 7 2 0 0 0
5 0 3 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
其中0表示该框为空。 非常感谢你的帮助!