8 个皇后谜题 - 使用 python 递归

Posted

技术标签:

【中文标题】8 个皇后谜题 - 使用 python 递归【英文标题】:8 queens puzzle - recursion using python 【发布时间】:2013-12-21 23:49:35 【问题描述】:

我正在尝试解决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.. 因此我知道它有效,但我想避免这个全局计数器。

你能帮忙吗?

【问题讨论】:

Minor:sum 是一个非常有用的内置函数的名称,因此对于您自己的变量来说是一个不好的名称。 哦,当然。谢谢! 【参考方案1】:

您可以使用solve的返回值来跟踪总和:

def queens_sum(N):
    return solve(N, [0]*N, 0, N)

def solve(N, table, column, end):
    if column == end:
        return 1

    sum = 0
    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
            sum += solve(N, table, column+1, end)
        #else: we can't place queen here, we should abort this direction
            # do nothing

    return sum

【讨论】:

谢谢加雷斯!固定。

以上是关于8 个皇后谜题 - 使用 python 递归的主要内容,如果未能解决你的问题,请参考以下文章

Python用迭代(yield)和递归解决八皇后问题

八皇后问题Python实现

Python----递归------Eight Queens 八皇后问题

n皇后问题中的回溯和递归(Python)

八皇后,回溯与递归(Python实现)

八皇后问题(递归的使用)