- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试用 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);
浅拷贝不适用于高维数组。有没有更好的方法,因为我听说 deepcopy 存在一些问题?建议使用二维列表以外的不同数据结构的答案也是可以接受的。
非常感谢
最佳答案
deepcopy 没有问题,真的,只是它有时会很慢。在这种情况下,这可能不是问题。但是有几种选择。
如果你想坚持使用列表,你可以简单地制作一个单层副本:
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)制作二维数组的习惯用法:
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
关于Python:按值递归传递,4 个皇后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13105626/
最初的 N-Queen 问题是关于在 N*N 棋盘上放置 N 个皇后。 然而,我却被一位学界 friend 质疑: 有预定义皇后的 N 皇后问题的 NP 完备性证明吗? 定义是: 假设: N = 8,
我正在尝试解决 N 皇后问题。您可以在 https://leetcode.com/problems/n-queens/ 中找到问题. 对于回溯,我了解到我们可以用三个关键来解决问题: 做出选择 约束
我正在用 Java 制作国际象棋游戏。 我做了一个 JFrame,它可以让我创建棋子,这就是为什么我对任何棋子都有所有可能的走法(并且我将制作比正常国际象棋中更多的棋子)。 但是我有一个小问题,我已经
我编写了一个 N-Queens 难题的 Java 小算法(使用 c*c 棋盘)。您将在下面找到我的递归方法的代码。 它没有找到所有的解决方案。 我的功能是什么 这个想法是在主方法中第一次调用我的函数,
我写了两个程序: 通过回溯算法在没有任何威胁的情况下将 n 个皇后放在棋盘上。但这对于 big n 来说非常沉重。最后你可以运行 100 个皇后。 在没有任何爬山算法威胁的情况下,将 n 个皇后放在棋
我是一名优秀的程序员,十分优秀!