我知道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]。
答案 0 :(得分:1)
如果要从函数更改全局变量,则需要将其标记为全局变量,否则,函数会将该变量视为局部变量。那就是你得到的。在queens
函数中,您会得到空的complete
列表。请注意,您可以引用全局(就像您在printQ
和solve
函数中一样,但是如果要更改它(就像您在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