首页 > 解决方案 > 一维 N 皇后数组 (Python) 求解函数

问题描述

我知道 N_Queens 是一个很好的话题,但我必须找到一个使用 1D 数组的好的 python 解决方案(重要的是,通过填充 1d 数组然后通过函数将其转换为 2d 数组来解决)。

到目前为止,我已经完成了(我认为我做得太复杂的)打印和检查功能,但我似乎无法完成求解功能。

global queens
queens = []

def printQ():
    for i in queens:
        for row in range(8):
            if row == i:
                print(" Q",end="")
            else:
                print(" .",end="")
        print(" ")

def solve(x):
    step = len(queens) 
    for indices in range(step):
        if (x == queens[indices]):
            return False
    for i in range(step,0,-1):    
        if (x == queens[0-i]-i) or (x == queens[0-i]+i):
            return False       
    else:
        return True


def complete():
    for i in range(8):
        if solve(i) == True:
            queens += [i]
        elif solve(i) == False:
            queens = queens - [i]
        else:
            return

如果可能,我尝试遍历列表并将元素放置在全局 [queens] 中。每次我尝试更改 complete() 时,我要么得到一个空列表,要么得到一个错误。我试图通过回溯解决这个问题,但我不确定我的伪代码应该如何查找完整()

任何建议将不胜感激,如果我的代码质量不高,仍然是初学者,我们深表歉意。

注意:要证明这两个函数都有效,只需将项目添加到数组 [1,4,2] 中即可。

标签: pythonbacktrackingn-queens

解决方案


如果要从函数更改全局变量,则需要将其标记为全局变量,否则,函数会将该变量视为局部变量。这就是你得到的。您在函数中得到空queens列表。complete请注意,您可以引用全局(就像您在printQsolve函数中所做的那样,但如果您要更改它(就像您在complete函数中所做的那样),您必须将其标记为global。这是一个如何做到这一点的示例。你也不要'不需要在模块级别将其标记为全局(代码中的第一行)它必须在函数级别

def complete():
    global queens
    for i in range(8):
        if solve(i) == True:
            queens += [i]
        elif solve(i) == False:
            queens = queens - [i]
        else:
            return

推荐阅读