在典型的四叉树的结构中,我们的前提是一个4×4的网格,在网格中,我们所要面临的问题是同一行,同一列上,或者是对角线上都不能出现2个皇后,在解释这个问题时,问题划分为以下步骤求解。
- 在选定第一列(行)的元素,元素有4种可能,因此可以称四叉树;
2选定第一列(行)的元素后,第二列(行)的元素有三种可能
3 依次选择第三行和第四行的元素
N皇后问题的伪代码实现原理
首先,明确在N皇后问题中会出现的情况
- 不能在对角线上
即 col=row - 在右斜线上和左斜线上,其中左斜线的情况
图例中出现在右斜线的情况
3,1,2,3,3
即col+row=col+row
3 出现在右斜线的情况
图中的情况是2,1,3,2,4,3
即col-row=col-row
上述情况是明确判断行,明确判定之后,是否满足是我们判断标准的情况
其次,我们以列表[]来表示我们的填充结果,列表的每列都代表列数
List=[]#长度为N
伪代码如下:
row=0 #以第0行为开始
Def dfs(): #num我们的N皇后问题的N
If row#num: #判断我们停止退出的条件
Print(res)
Return
#遍历所有的行所匹配的每一列
即递归dfs (num,res,row+1) for col in range(num):
If check (col,res,row):
判断在当前row的情况下,每一列cd的结果标准
Res[row] =col #将当前行所对应的列数改为col值,并进行下一行的搜索
Fes [row]=0 #比如,在row=0.填充数字后,row=1,未找到合适的res[i]=0,
N皇后问题的伪代码实现原理
最终填充行列的回溯过程,回溯过程如下:
最结果的运行脚本结果:
def dfs(num, res, row):
# 参数:当前列 位置总结果 当前行
if row == num:
print(res)
return
for col in range(num):
# 若可行
if check(col, res, row):
# 将该 row 行的数值改成列数 col
res[row] = col
# 进行下一行的搜索
dfs(num, res, row + 1)
# 若进行到这一步说明,上一步走后,后续无法再放置皇后,需要回溯
# 也可以不回溯,因为进入下一个循环(将该 row 行的数值改成列数 col + 1)后,会重新对 res[row] 赋值
res[row] = 0
# 参数:当前列 位置总结果 当前行
def check(col, res, row):
# 遍历已经放好皇后的所有行(不用判断是否在同一行,因为一行有值后,会进行到下一个 dfs)
#print(res)
for i in range(row):
# 1、是否在同一列中 2、左斜线:(行 + 列)的值相等 3、右斜线:(列 - 行)的值相等
if res[i] == col or res[i] + i == row + col or res[i] - i == col - row:
return False
return True
if __name__ == '__main__':
# num: 皇后的数量
num = int(input('请输入皇后的数量:'))
# 最终皇后的位置 (下标:第几行 数值:第几列)
res = [0 for _ in range(num)]
# 从第一行开始
row = 0
# 参数:皇后总数 位置结果 当前放置第几行
dfs(num, res, row)