Python:递归传递值,4个皇后

时间:2012-10-28 01:22:12

标签: python

我试图在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列表的不同数据结构的答案也是可以接受的。

非常感谢

1 个答案:

答案 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