这个算法采用的是一维数组,皇后个数即数组长度,数组值即对应行皇后所在的列。
按照每行至上而下,每一行从第一列起尝试放置皇后,每次仅需判断对于已经放置的皇后是否产生冲突。如果某个位置可以放置,则放置皇后(数组赋值),进入下一行判断;如果此行尝试到最后一列都没有可以放置的位置,则回溯到上一行,将上一行的皇后向后移动一列,如果皇后已经在最后一列,则继续向上回溯;终止条件即第一行皇后在最后一列,且就要移出界。
代码如下:
"""
Python版回溯法求解N皇后问题。
主程序的循环逻辑判断部分还有很大优化必要。
"""
def suit(x, y): # 判断第x行、第y列能否放皇后
if(x == 0): # 第一行一定可以
return True
i = 1
while(x - i >= 0): # 循环测试前x行
if(a[x - i] == y or a[x - i] - y == i or a[x - i] - y == -i):
return False
i += 1
return True
def start(): # 主程序
count = 0 # 计数解的个数
global a # 便于函数访问
n = int(input("皇后数:"))
print_map = input("需要打印每个布局吗?(Y/N):