N皇后问题-利用python实现

在这里插入图片描述

在典型的四叉树的结构中,我们的前提是一个4×4的网格,在网格中,我们所要面临的问题是同一行,同一列上,或者是对角线上都不能出现2个皇后,在解释这个问题时,问题划分为以下步骤求解。

  1. 在选定第一列(行)的元素,元素有4种可能,因此可以称四叉树;

在这里插入图片描述
2选定第一列(行)的元素后,第二列(行)的元素有三种可能
在这里插入图片描述
3 依次选择第三行和第四行的元素
在这里插入图片描述

N皇后问题的伪代码实现原理

首先,明确在N皇后问题中会出现的情况

  1. 不能在对角线上
    即 col=row
  2. 在右斜线上和左斜线上,其中左斜线的情况
    图例中出现在右斜线的情况
    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)
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值