八皇后问题学习 (二叉树与回溯法比较)

以全排列问题、八皇后问题为例深入理解递归与分治的编程思想 一、什么是递归与分治?通过最近的对数据结构的学习以及看了很多博主给出的解决全排列还有八皇后问题的算法,对于递归和分治我有了更深入的理解。分治可以理解成是把一个问题划分成很多性质、模式都与这个问题相似或一致的子问题,同样,子问题也可以再重新划分成更多的子问题,这样就可以通过相似的算法来解决各个子问题,最后把这些结果合并即得到了所要解决的问题的解,而递归恰恰是实现分治思想的好方法。例如:二叉树的前中后... 阅读详情

从n*n个格子中,放置n个皇后

皇后是国际象棋中最强的棋子,无论是横,竖,还是斜向,都是她的控制范围

我们需要把这n个皇后放置在这正方形的棋盘中,同时要求皇后之间不会相互影响

我看了二叉树的解决方式,是使用八叉树

即从根节点开始,其子节点分别在同一列放置一个皇后,同时各不相同

第二层同理,每一个一层子节点的子节点分别在每一个空格上放置一个皇后

这样有一个深度为9的8叉树。

这时需要遍历每一种情况,也就是说8!次遍历,将每一个满足条件的棋盘状态输出出来

这无疑是非常慢的。

于是我又学习了回溯法,它的思想可以一开始就将不符合条件的棋盘状态大部分剔除

学自

https://www.cnblogs.com/bigmoyan/p/4521683.html

void queen(int row){
    if(row==n)
        total++;
    else
        for(int col=0;col!=n;col++){
            c[row]=col;
            if(is_ok(row))
                queen(row+1);
        }        
}

 

  算法是逐行安排皇后的,其参数row为现在正执行到第几行。n是皇后数,在八皇后问题里当然就是8啦。

  第2行好理解,如果程序当前能正常执行到第8行,那自然是找到了一种解法,于是八皇后问题解法数加1。

  如果当前还没排到第八行,则进入else语句。遍历所有列col,将当前col存储在数组c里,然后使用is_ok()检查row行col列能不能摆皇后,若能摆皇后,则递归调用queen去安排下一列摆皇后的问题。

  还不太清楚?再慢点来,刚开始的时候row=0,意思是要对第0行摆皇后了。

  If判断失败,进入else,进入for循环,col初始化为0

  显然,0行0列的位置一定可以摆皇后的,因为这是第一个皇后啊,后宫空荡她想怎么折腾就怎么折腾,于是is_ok(0)测试成功,递归调用queen(1)安排第1行的皇后问题。

  第1行时row=1,进来if依然测试失败,进入for循环,col初始化为0。1行0列显然是不能摆皇后的,因为0行0列已经有一个圣母皇太后在那搁着了,于是is_ok()测试失败,循环什么也不做空转一圈,col变为1。1行1列依然is_ok()测试失败,一直到1行2列,发现可以摆皇后,于是继续递归queen(2)去安排第二个皇后位置。

  如果在某种情况下问题无解呢?例如前面在4皇后问题中,0行0列摆皇后是无解的。假设前面递归到queen(2)时候,发现第2行没有地方可以摆皇后,那怎么办呢?要注意queen(2)的调用是在queen(1)的for循环框架内的,queen(2)若无解,则自然而然queen(1)的for循环col自加1,即将第1行的皇后从1行2列改为1行3列的位置,检查可否放皇后后继续安排下一行的皇后。如此递归,当queen(0)的col自加到7,说明第一列的皇后已经遍历了从0行1列到0行7列,此时for循环结束,程序退出。

  在主函数中调用queen(0),得到正确结果,8皇后问题一共有92种解法。

#include<iostream>
#include<math.h>
using namespace std;

int n=8;
int total=0;
int *c=new int(n);

bool is_ok(int row){
    for(int j=0;j!=row;j++){
        if(c[row]==c[j] || row-c[row]==j-c[j] || row+c[row]==j+c[j])
            return false;
    }
    return true;
}

void queen(int row){
    if(row==n)
        total++;
    else
        for(int col=0;col!=n;col++){
            c[row]=col;
            if(is_ok(row))
                queen(row+1);
        }       
}

int main(){
    queen(0);
    cout<<total;
    return 1;
}

 

经典的"8皇后"问题(八叉树) 思路:      假设取出一个皇后,放入一行,有8种放置方法,接下来,再取一个皇后,放入下一行,如果不考虑皇后之间”吃“的问题,也同样有8种放置方法,所以可以先将该问题考虑成一个完全8叉树。从根节点开始,每次放一个皇后,树增加一层,一直到第8层,根节点是第0层;利用深度优先搜索,根据限制条件,剔除不符合规则的子树:首先假定在第i行,皇后放在x[i]这个位置:规则1:不能同一行同一列,x[i]不能相... 阅读详情

相关推荐

回溯算法 | 追忆那些年曾难倒我们的八皇后问题

前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题…… 第一次遇到它的时候应该是大一下或者大二这个期间,这个时间对啥都懵懵懂懂,啥都想学却发现好像啥都挺难的,八皇后同样把那个时候的我阻拦在外,我记得很清楚当时大二初我们学业导师给我们开班会时候讲到的一句话很清晰:“如果没有认真的学习算法他怎么可能解出八皇后的代码呢”。 确实,那个时候的我搞不懂递归,回溯也没听过,连Java的集合都没用明白,毫无逻辑可言,八皇后对我来说确实就是无从下手。 但今

bigsai 3503

从二叉树到八皇后问题

一、树的基本概念树的定义:由一个或多个(n≥0)结点组成的有限集合T,有且仅有一个结点称为根(root),当n>1 时,其余的结点分为m(m≥0)个互不相交的有限集合T1,T2,…,Tm。每个集合本身 又是棵树,被称作这个根的子树树的存储结构顺序存储可规定为:从上至下、从左至右将树的结点依次存入内存。 重大缺陷:复原困难(不能唯一复原就没有实用价值)。链式存储可用多重链表:一个前趋指针,n 个

Hacker的博客 1021

RAG优化知识库检索(4):混合检索技术

混合检索技术在RAG(检索增强生成)系统中的应用显著提升了检索效果。本文探讨了语义检索与关键词检索的优缺点,指出两者在语义理解和精确匹配方面的互补性。通过结合BM25与向量检索,混合检索系统能够更全面地捕捉文档的相关性。文章详细介绍了并行检索、级联检索、稀疏-密集混合表示等多种结合方式,并探讨了权重调整策略,如线性组合、动态权重调整和排序融合算法。此外,稀疏-密集混合检索架构的设计和实现方案也被深入分析,展示了如何通过结合不同检索方法的优势,提升RAG系统的检索质量和效率。

分享一些感兴趣的技术方面 2073

回溯与搜索 二 八皇后问题 马的遍历

八皇后问题:要在国际象棋棋盘中放八个皇后,使任意两个皇后都不能互相吃。(提示:皇后能吃同一行、同一列、同一对角线的任意棋子。) 放置第i个(行)皇后的算法为: int search(i) { int j; for(第i个皇后的位置j=1;j<=8;j++) //在i行的8列中逐个去试 if(本行本列允许放置皇后){ 放置第i个皇后; 对放置位置进行标记; if(...

lybc2019的博客 601

《科研伦理与学术规范》 全部 习题_答案 2020年秋

科研伦理与学术规范 答案 文章目录科研伦理与学术规范 答案1. 第一章课后习题(必做) 答案1.1 第一章Demo2. 第二章课后习题(必做) 答案3. 第三章课后习题(必做) 答案4. 第四章课后习题(必做) 答案5. 第五章课后习题(必做) 答案6. 第六章课后习题(必做) 答案 # 每行5题 #写于2020.11.17 侵删 1. 第一章课后习题(必做) 答案 ABC, A, B ,D ,ABCD ABC, D, A, BCD, C D, D, 1.1 第一章Demo

羊老羊 25万+

USB2.0物理层实战:手把手教你用示波器抓取D+/D-信号(附波形分析)

本文是一份针对硬件工程师的USB2.0物理层信号调试实战指南。文章详细讲解了如何使用示波器捕获和分析D+/D-差分信号,从基础设置、核心信号状态解读,到信号完整性分析与常见问题排查,手把手教你定位USB通信故障。内容涵盖USB2.0协议物理层关键概念,并附有基础解码思路,旨在提升工程师的底层调试能力。

s8t9u0v1w的博客 453

数据结构(六)—— 二叉树(4)回溯

回溯

weixin_42690036的博客 1459

DCDC: 前馈电容优化环路稳定性的设计与验证方法

本文深入探讨了DCDC转换器中前馈电容对环路稳定性的优化设计与验证方法。通过分析前馈电容的作用原理、选型计算和实验验证,详细介绍了如何利用穿越频率和相位裕度等关键参数提升系统性能。文章还提供了实用的设计经验和问题排查技巧,帮助工程师在实际应用中实现DCDC转换器的最佳稳定性。

weixin_42531516的博客 440

八皇后时间复杂度_回溯算法 | 追忆那些年曾难倒我们的八皇后问题

文章收录在公众号:bigsai,关注更多干货和学习资源记得点赞、在看前言说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题……在这里插入图片描述第一次遇到它的时候应该是大一下或者大二这个期间,这个时间对啥都懵懵懂懂,啥都想学却发现好像啥都挺难的,八皇后同样把那个时候的我阻拦在外,我记得很清楚当时大二初我们学业导师给我们开班会时候...

weixin_39688170的博客 3313

【CIC-IDS数据集+机器学习】实现网络流量异常检测

本项目基于CIC-IDS数据集,使用多种机器学习算法实现网络流量异常检测系统。项目采用了完整的机器学习工作流程,从数据预处理到模型部署,实现了高精度的网络入侵检测。

XiaoMu_001的博客 1936

华大HC32F460串口超时中断+DMA收发实战:从STM32迁移的避坑指南

本文为从STM32迁移至华大HC32F460的开发者提供了串口DMA收发的实战避坑指南。核心在于理解HC32F460以串口接收超时中断替代空闲中断的机制,并调整DMA配置策略:DMA应设置为由串口接收事件持续触发搬运,超时中断仅负责通知和重置DMA,从而实现高效可靠的数据收发。

weixin_29175469的博客 114

回溯法小结

背景介绍:回溯法是一种穷举类型的算法,与其说它是一种算法,倒不如说它是一种试法。回溯法并没有什么高深的算法思想,虽然名字起的很高规格,但其实它的算法性连二分查找都比不上。这里说的算法性其实就是指技巧性,对问题特性了解越深入,越能创造出很巧妙的算法,在时间复杂度的级别上提高算法效率。这体现了算法效率与适用性之间的矛盾,二分查找效率很高,但适用性比较低,类似的还有著名的KMP算法。而穷举法效率最低,但

让代码改变世界 7149

别再踩坑了!QT5.15.2配置Android开发环境保姆级避坑指南(含Java8、SDK Tools版本选择)

本文提供QT5.15.2配置Android开发环境的详细避坑指南,重点解决版本锁定、SDK工具选择和QtCreator配置等常见问题。通过实测推荐的Java8、Android SDK Tools版本及NDK配置,帮助开发者高效完成环境搭建,避免隐性冲突和配置失败。

weixin_42537919的博客 239

回溯法:N皇后与解数独

好久没写博客了,最近比较忙,在系统学习一些知识,没学完之前不太容易输出高质量文章,等过段时间学完了再整理一下写几篇文章出来。 但中间也在用零碎的时间学学别的,今天写总结一下回溯法。 概念 回溯法作为一种搜索算法,可以找出所有或一部分解的一般性算法,尤其适用于约束满足问题,例如今天要讲的N皇后、解数独等等。 回溯法采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试

张可的博客 697

IP-Guard分类管理详解

大家都知道在配置IPGUARD策略前需要做分类库进行设置和分类。 1、应用程序:可以分类,例如上班时间只能用OFFICE和WPS,记事本等办公软件,可以在分类里设置一个类 ;办公软件,在未分类里找到OFFICE,WPS等拖入心建的分类里就可以在配置策略里调用。 2、网站分类也不一样,可以按照自己方式自定义。也可以导入厂家已经收集到的网站分类。 3、邮箱分类:可以提前定义好一个或...

IP-Guard专栏 591

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

算法之回溯法学习笔记

把问题得解空间转化为图或树: 1.子集树:集合中满足条件的子集等,N叉树 2.排列树:确定n个元素满足某种性质的排列,“排列树”并不是N叉树,不能重复选择 0/1背包问题<——>二叉树(0,1)<——>子集树 backtrack(t) ——> 找到t层以下的所有解(每一层代表选不选该货物,0代表不选,1代表选) O 0/ \1 O O 0 / 1...

qq_30560631的博客 312

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

回溯法求解n个元素的集合的幂集

回溯法求解n个元素的集合的幂集

Keep_Trying_Go的博客 2591

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

八皇后问题递归解法

八皇后问题

lee的专栏 7088

回溯 皇后 算法笔记_回溯算法 | 追忆那些年曾难倒我们的八皇后问题

文章收录在公众号:bigsai,关注更多干货和学习资源记得点赞、在看前言说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题……在这里插入图片描述第一次遇到它的时候应该是大一下或者大二这个期间,这个时间对啥都懵懵懂懂,啥都想学却发现好像啥都挺难的,八皇后同样把那个时候的我阻拦在外,我记得很清楚当时大二初我们学业导师给我们开班会时候...

weixin_35235724的博客 133

回溯 皇后 算法笔记_回溯算法|追忆那些年难到我们的八皇后问题

文章收录在公众号:bigsai,关注更多干货和学习资源前言说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题……第一次遇到它的时候应该是大一下或者大二这个期间,这个时间对啥都懵懵懂懂,啥都想学却发现好像啥都挺难的,八皇后同样把那个时候的我阻拦在外,我记得很清楚当时大二初我们学业导师给我们开班会时候讲到的一句话很清晰:"如果没有认真的学习算...

weixin_36340672的博客 119

多字段回溯 mysql_回溯算法 | 追忆那些年曾难倒我们的八皇后问题

前言说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题……在这里插入图片描述第一次遇到它的时候应该是大一下或者大二这个期间,这个时间对啥都懵懵懂懂,啥都想学却发现好像啥都挺难的,八皇后同样把那个时候的我阻拦在外,我记得很清楚当时大二初我们学业导师给我们开班会时候讲到的一句话很清晰:"如果没有认真的学习算法他怎么可能解出八皇后的代码呢"。确...

weixin_39960019的博客 172

算法 判断多个点是否在同一圆周线上_回溯算法|追忆那些年难到我们的八皇后问题

文章收录在公众号:bigsai,关注更多干货和学习资源前言说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题……第一次遇到它的时候应该是大一下或者大二这个期间,这个时间对啥都懵懵懂懂,啥都想学却发现好像啥都挺难的,八皇后同样把那个时候的我阻拦在外,我记得很清楚当时大二初我们学业导师给我们开班会时候讲到的一句话很清晰:"如果没有认真的学习算...

weixin_39689687的博客 193

人工智能实现a*算法解决八数码_小白带你学--回溯算法

微信公众号:小白算法关注可了解更多算法,并能领取免费资料。问题或建议,请公众号留言;小白算法,简单白话算法,每个人都能看懂的算法上一期算法回顾--贪婪法:https://mp.weixin.qq.com/s/978Tdplj3IaSG2dc-5F-aw算法导读本期算法讲解思路:白话算法->算法思路->实例:八皇后问题->实例:01背包问题->算法教你玩数独白话算法回溯法(b...

weixin_39721807的博客 368
上一篇: 数据结构学习之二叉树
下一篇: 云时代的整合作业
杨鼎睿
博客等级 码龄9年 7粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值