我正在尝试解决8-queens puzzle,也称为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
..因此我知道它有效,但我想避免这个全局反击 .
你能帮我吗?
1 回答
您可以使用solve的返回值来跟踪总和: