一维N皇后数组(Python)解决函数

时间:2019-01-20 10:03:33

标签: python backtracking n-queens

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

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

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

我正在尝试遍历列表,并在可能的情况下将元素放置在全局[queen]中。每次我尝试更改complete()时,我都会得到一个空列表或一个错误。我正在尝试通过回溯来解决此问题,但是我不确定我的伪代码应如何查找complete()

任何建议都将不胜感激,如果我的代码质量不高,很抱歉,还是一个初学者。

注意:为了证明两个函数都起作用,例如,只需将项目添加到数组[1,4,2]。

1 个答案:

答案 0 :(得分:1)

如果要从函数更改全局变量,则需要将其标记为全局变量,否则,函数会将该变量视为局部变量。那就是你得到的。在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