我试图在Python中实现回溯算法来解决4皇后问题。我创建了一个类Queens,其中包含以下内容:
def __init__(self, board_size=4):
self.board = [[0 for i in xrange(0,board_size)] for i in xrange(0,board_size)];
但是当我实现递归回溯时,由于通过引用传递,电路板在所访问的每个地方都被填充了1。
def backtrack(self, board, next_column):
(algorithm here) ...
board[i][column] = 1 ... #to indicate a placed queen
self.backtrack(board, next_column + 1);
(rest of algorithm)
我知道我可以做到
new_board = copy.deepcopy(board);
浅版不适用于更高维数组。 有没有更好的方法来做到这一点,因为我听说深度复制存在一些问题? 建议不同于2d列表的不同数据结构的答案也是可以接受的。
非常感谢
答案 0 :(得分:1)
深度镜检查没有问题,实际上,有时它可能会很慢。在这种情况下,这可能不是问题。但有几种选择。
如果你想坚持使用列表,你可以简单地制作一个深度的副本:
In [63]: n = 8
In [64]: board = [[0 for i in range(n)] for i in range(n)]
In [65]: timeit board2 = [r[:] for r in board]
100000 loops, best of 3: 3.24 us per loop
In [66]: timeit board2 = copy.deepcopy(board)
10000 loops, best of 3: 92.8 us per loop
请注意,深度检查很慢。
[附注:实际上,这是我最喜欢的(非numpy)用于制作2D阵列的习语:
In [69]: board = [x[:] for x in [[0]*n]*n]
但是很多人不喜欢它,因为它太接近错误的东西了,即使它本身是有效的,并且在这个意义上也不是很强大。]
但也许更好的方法是使用字典:
In [79]: board = {(i,j): 0 for i in range(n) for j in range(n)}
In [80]: timeit board2 = board.copy()
100000 loops, best of 3: 3.46 us per loop