如何在python

时间:2016-03-21 22:44:47

标签: python

我遇到一个试图解决数独的简单代码的问题。我在这里跳过有关我用来解决数独的方法的细节。我认为目前唯一重要的事情是:当算法被卡住时(例如,因为我们在数独中找不到更多的数字)我调用了一个搜索框的函数,其中空的,只能包含两个可能的数字。然后该函数获取两个候选者之间的最大数字,并将其替换为空框。然后我要求代码尝试使用这个新数字来解决数独。显然,我想在替换我的猜测之前保存数独矩阵的备份副本。问题出现了......当我修改数独矩阵时,备份副本也会被修改。目前我还没有找到任何解决方案。 为了更清楚,我在下面报告了提出问题的代码的简化版本:

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表示该框为空。 非常感谢你的帮助!

0 个答案:

没有答案