算法|八皇后问题理解回溯法

算法|八皇后问题理解回溯法

回溯算法从空解开始,并逐步扩展该解。搜索递归地通过各种不同的构造解决方案的路径。

例如,考虑计算n皇后问题:在n*n的棋盘上放置彼此不受攻击的n个皇后。

(皇后可以攻击在同一行、同一列、同一斜线上的棋子)

按以上规则:同一行或同一列或同一斜线上只能有一个皇后,同一行或同一列上必须有一个皇后。

n皇后问题的解空间是一棵n叉树,树的深度为n。

当n为4时,有两种可能的解决方案:

八皇后问题对于每一行是否可以放置皇后,可用一个规模为8的循环去判断。每一行的判断操作相同,如果操作完成了8行(放置了8个皇后),便求出了一个解。所以该问题可以用递归去做。如果某一行全部位置无法放置皇后时,没必要继续深入,可以回溯到上一步,也就是使用回溯法。对于非尾递归,递归函数回退时,递归点后面的代码就是递归函数回退后执行的部分。对于八皇后问题,上述的循环可以判断某行下一列是否可以放置皇后,而上一列放置皇后的操作进行逆操作后便完成了回溯(递归有天然的回退阶段)。

八皇后问题的暴力枚举搜索或递归解法会形成一个棵8叉完全树,回溯解法可以通过约束条件避免一些搜索继续深入,形成一棵8叉不完全树。

为简便起见,我们可以用四皇后问题去理解,然后泛化到一般的情况。

在底层,前三种配置是非法的,因为皇后们互相攻击。然而,第四种配置是有效的,可以通过在棋盘上再放置两个皇后来扩展到完整的解决方案。只有一种方法可以放置剩下的两个皇后。

如下面左图所示:

从y=0,x=0开始,search(0)递归调用search(1)(x=2,y=1),递归调用search(2)

当y=2,x=3时,递归函数search(2)执行完毕,回退到search(1),x=0,逆操作,循环到x=3……

code demo:

#include #define n 4int column[n*2] = {0};int diag1[n*2] = {0};int diag2[n*2] = {0};int count = 0;void search(int y) { if (y == n) { count++; return; } for (int x = 0; x < n; x++) { if (column[x] || diag1[x+y] || diag2[x-y+n-1]) continue; column[x] = diag1[x+y] = diag2[x-y+n-1] = 1; search(y+1); column[x] = diag1[x+y] = diag2[x-y+n-1] = 0; // 回退时的逆操作,下一轮循环x++ } return;}main(){ search(0); printf("%d",count); getchar();}/*n=4, 2n=8, 92n=16, 14772512*/

搜索从调用search(0)开始。棋盘的大小为n*n,代码计算要计数的解决方案数。

代码假设棋盘的行和列编号从0到n-1。当使用参数y调用函数搜索时,它会在行y上放置皇后,然后使用参数y-1调用自身。然后,如果y=n,则已找到解决方案,变量count增加1。

数组column跟踪包含皇后的列,数组diag1和diag2跟踪对角线。不允许在已包含皇后的列或对角线中添加其他皇后。例如,4*4棋盘编号如下,当x、y取不同的值时,对应列方向column[x]、”/”方向上diag1[x+y]、””方向上diag2[x-y+4-1]的取值为0时表示无皇后:

y 2,x=3

回溯。

y 1,x=3

……

count=1。

回溯到下面绿色点:

继续逐步回溯:

……

count=2。

继续逐步回溯,最后count=2。

可视化操作的网页地址:

https://pythontutor.com/render.html#mode=display

-End-

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年8月22日
下一篇 2022年8月22日

相关推荐

  • 加了!搭载鸿蒙最新版,iPhone14瞬间不香了

    如今各品牌的手机层出不穷,但是大家总感觉缺少一点冲击性,原因很简答,那就是因为大家都在等待着华为Mate 50系列的到来。 华为的Mate 40系列已经发布有一年多了,因为禁令的问…

    2022年6月15日
  • 专题推荐 – 农产品物流智能管控专题

    本专题小编共整理了3篇文章,来自国家农业信息化工程技术研究中心、广西大学、河北农业大学等单位。 文章包含雏鸡配送车辆调度优化模型、生鲜农产品配送路径优化模型、多目标蔬菜运输配送路径…

    2022年8月17日
  • 冷门载具驾驶教学!多会一种载具,就多一条夺冠之路

    在和平赛场上,一些操作难度较高的载具,如三轮摩托车和滑翔机,它们较为少见。今天鸡仔将给特种兵讲解一番如何将这两个冷门载具驾驶好!让大家在夺冠之路中多一种载具选择~ #1、三轮摩托车…

    2022年8月22日
  • 医疗终于止跌,行情要启动了吗?

    “医疗,即将暴涨!!!” 涨涨涨,医疗是什么样的脾气。你又不是不知道!涨了3天了,你这个时候追,套你两天又受不了了。 那医疗是不是回调结束了,接下来怎么操作呢? 我们先来看看医疗这…

    2022年8月7日
  • 什么是胎位不正?这些纠正方法你了解吗?

    胎位全称胎方位 是指胎儿先露部的指示点与 母体骨盆的关系 胎位粗略的可分为三种 头先露、臀先露、肩先露 其中,头先露是正常胎位 肩先露多为暂时性胎位 臀先露是最常见的异常胎位 妊娠…

    2022年8月19日
  • 什么是手机互联/映射

    手机互联/映射就是将手机导航、视频、音乐、电话等投屏到中控屏上,通过显示器可以操作手机。手机映射功能的加入,可以方便利用车内大屏观看手机中的导航信息等。     手机互联是指手机通…

    2022年6月22日
  • 嵌入式面试常问的16个C语言问题

    最近不少小伙伴在找工作,这里我给大家分享一下面试中经常会遇到的一些嵌入式C语言问题,你看看能答上来几个呢? 1 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽…

    2022年6月12日
  • 智能门锁、充电器均有安全风险,联想GIC全球安全实验室如何解决?

    记者 | 崔鹏 编辑 | 2022年6月16日下午,联想GIC全球安全实验室正式对外露面,对外介绍联想在产品全生命周期安全保护、数据安全与隐私保护和产品安全防御体系等方面的部分进展…

    2022年6月20日
  • 无需物理接触!新系统使用声学悬浮组装零件

    科技日报记者 张梦然 西班牙纳瓦拉公立大学研究人员开发出一种使用声学操作就可组装物体而的系统“LeviPrint”。该系统产生的声场可捕获小颗粒、胶滴甚至细长的棒状零件,在它们悬浮…

    2022年7月1日
  • 七爪源码:让我们了解 Express.js 中的中间件

    Express.js 中的中间件概念简单有趣的介绍 如果你已经在 Node.js 周围呆了足够长的时间,你可能已经听说过中间件,我不会撒谎,当我第一次遇到 WORD ITSELF …

    2022年6月19日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息