我编写了一个Sudoku解算器,并在适当的Sudoku板中转换字符串时遇到了问题。
示例输入是“2.3.8 .... 8..7 ........... 1 ... 6.5.7 ...... 4 ...... 3 .. ..1 ............ 82.5 .... 6 ... 1 ......” 告诉用户什么数字应该放入数独板的正方形。 '。'或者'0'代表一个空白,我用列表[1,2,...,8,9]填充列表中的位置。这是通过转换功能完成的。它是在第一次调用函数时正确完成的,但是第二次和第三次都是错误地完成(看起来新板存储了前一个板的一些信息)。
在这个编码示例中,第二个打印功能打印不正确,在前两个8之间,我打印的列表中有一个不应该存在的6个,并且我相信它来自之前的转换调用“easy_board”。
请看一下。感谢。
print "Welcome to 9X9 Sudoku in Python"
SIZE = 81
LENGTH = 9
empty_board = [[i for i in xrange(1, LENGTH + 1)] for j in xrange(0, SIZE)]
def transform(input):
if len(input) != SIZE:
print "Input length [%d] is not of the correct size [%d]." % len(input), SIZE
return
board = empty_board
for i in xrange(SIZE):
if input[i] != '0' and input[i] != '.':
board[i] = [int(input[i])]
return board
easy_board = "003020600900305001001806400008102900700000008006708200002609500800203009005010300"
medium_board = "2.3.8....8..7...........1...6.5.7...4......3....1............82.5....6...1......."
hard_board = ".6.5.4.3.1...9...8.........9...5...6.4.6.2.7.7...4...5.........4...8...1.5.2.3.4."
print "\ndoing ez board"
our_board = transform(easy_board)
print our_board
print "\ndoing medium board"
our_board = transform(medium_board)
print our_board
print "\ndoing hard board"
our_board = transform(hard_board)
print our_board
答案 0 :(得分:2)
你的直觉是完全正确的!问题在于
行board = empty_board
在python中,大多数东西都是pass-by-reference,这意味着这一行只是声明变量board
是一个指向数组empty_board
的指针。如果您稍后在board
函数中修改transform
,则实际上是在修改empty_board
!
您想要的是复制 empty_board
到board
,您可以通过在文件顶部添加import copy
轻松完成,然后:
board = copy.deepcopy(empty_board)
请注意,您必须使用deepcopy
而不是仅复制,因为empty_board
是数组数组。如果您刚刚复制它,您将获得一个包含相同数组的新数组,因此当您修改新数组的内容时,您还将修改empty_board
的内容