我已经编写了以下代码来解决n-Queens problem,我们必须找到n
n*n
个n_queens
个皇后的所有合法(非攻击)展示位置棋盘。该代码使用标准的回溯解决方案。
此处方法solve_n_queens
使用使用递归的辅助方法result
。外部方法只是初始化全局列表col_placement
& def n_queens(n):
def solve_n_queens(row):
if row == n: # all queens are legally placed
result.append(list(col_placement))
return
for col in range(n):
# check if new queen is either 1) in same column or 2) same diagonal with any previously placed queen
if all(abs(col-c) not in (0, row-r)
for r, c in enumerate(col_placement[:row])):
col_placement[row] = col
solve_n_queens(row+1)
result, col_placement = [], [0] * n # result is empty initially; [0] * n means no queen is placed
solve_n_queens(0)
return result
并调用辅助方法。
n_queens(4)
这会为[[3, 1, 2, 1], [3, 1, 2, 1]]
result.append(col_placement)
然而,这不是一个算法错误,因为只是将第4行result.append(list(col_placement))
更改为 [[1, 3, 0, 2], [2, 0, 3, 1]]
会神秘地提供正确的输出
col_placement
当list
已经是list
时我不理解,为什么我们需要调用yarn
方法?
答案 0 :(得分:1)
问题在于,如果不使用list
,您将附加对您正在使用的相同且唯一的列表col_placement
的引用(因为您可以看到结果不仅错误,而且它们也是相同)。使用list
会创建一个新副本(col_placement
的即时快照),当col_placement
继续执行该程序的其余部分时,该副本将不会被修改。
所以基本上list(col_placement)
与col_placement.copy()
或col_placement[:]
相同。