我正在尝试解决8-queens 谜题,也称为 n-queens 算法。
我的功能应该计算有多少种合法的方式可以在 NxN 板上放置 N 个皇后。
我几乎明白了,但必须做一些丑陋的补丁才能让它工作。你能帮我修一下吗?
关于我所做的事情的简要说明:试图找出在 NxN 表中设置 N 个皇后的合法方法,我试图在 (N-1)xN 情况下使用递归来解决(删除第一列)至于事实同一列上不允许有两个皇后,我使用 N 的列表长度。每个单元格代表一列,在每一列中,我设置皇后所在的行号。
例如,
[0, 4, 7, 5, 2, 6, 1, 3]
意思是:
- 第 0 列 – 皇后放置在第 0 行
- 第 1 列 – 皇后放置在第 4 行
- 第 2 列 – 皇后放置在第 7 行
- 第 3 列 – 皇后放置在第 5 行
- 第 4 列 – 皇后放置在第 2 行
- 第 5 列 – 皇后放置在第 6 行
- 第 6 列 – 皇后放置在第 1 行
- 第 7 列 – 皇后放置在第 3 行
困扰我的事情是我不知道如何省略非法的女王放置。因此,为了使其工作,我使用了一个名为 的全局变量sum
,仅当递归达到合法的皇后完全放置时才增加它。
def is_available(n, table, column, N):
return not any(t in (n, n - i, n + i)
for t, i in zip(table, range(column, 0, -1)))
def queens_sum(N):
table = [0]*N
global sum
sum = 0
solve(N, table, 0, len(table))
return sum
def solve(N, table, column, end):
global sum
if column == end:
sum += 1
return None
for n in range(N):
# if no other queen can attack here, place a queen in this row
if is_available(n, table, column, N):
table[column] = n
# Omit the current column at the start
solve(N, table, column+1, end)
#else: we can't place queen here, we should abort this direction
# do nothing
因为N = 8
我得到sum = 92
.. 因此我知道它有效,但我想避免使用这个全局计数器。
你能帮我吗?