算法设计与分析——分支限界法——n皇后问题

算法分析之N皇后问题 因为这学期的算法分析课快要完了,也差不多进入复习阶段了,所以在这就把学习到的一些比较经典的算法拿出来晒晒,可能不是最好的,但怎么说也是为解决问题提供了一个思路。关于算法,有很多类型的问题,我在这里就拣一个复习一个了,呵呵。     今天要写的算法是源于八皇后问题,但在这里为了说明普遍性,直接介绍N皇后问题,与八皇后问题思路一样。这是ACM中一道典型的回溯题,当然其它方法也能对其求解,但毫无疑问回溯 阅读详情

一、问题描述

问题描述:在nn格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n皇后问题等价于在n*n的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。

算法设计:设计一个解n皇后问题的队列式分支限界法,计算在nn个方格上放置彼此不受攻击的n个皇后的一个放置方案。

*数据输入:由文件input.txt给出输入数据。第一行有1个正整数n。

*结果输出:将计算的彼此不受攻击的n个皇后的一个放置方案输出到文件output.txt。文件的第一行是n个皇后的放置方案。

输入文件:

input.txt

5

output.txt

1 3 5 2 4

二、问题分析
1.题目分析:

对于每一个放置点而言,它需要考虑四个方向上是否已经存在皇后。分别是行列,45度斜线和135度斜线。

行:每一行只放一个皇后,直到我们把最后一个皇后放到最后一行的合适位置,则算法结束。

列:列相同的约束条件,只需判断j是否相等即可。

45度斜线和135度斜线:约束条件——当前棋子和已放置好的棋子不能存在行数差的绝对值等于列数差的绝对值的情况,若存在则说明两个棋子在同一条斜线上

2.算法选择:

用分支限界法来解决n皇后问题。对于该问题它满足两种树结构。这里由于每一个合适的放置点出现最优解的概率是相等的,因此不需要使用优先队列。编译器提供了一个已经封装好的队列queue。

A.子集树。我们把行约束条件和其它约束条件放在一起,即认为每一行,棋子都有n个位置可以放置。于是它的空间结构如下:
在这里插入图片描述
假设n=3,这个图只画出了两层)

B.排列树。我们把行约束条件单独拿出来,也就是我们认为总共有八个皇后,这八个皇后必须都要放上去,但是放的位置不同,显然这是一个排列树。于是它的空间结构如下
在这里插入图片描述
这里由于我们还存在着其他的约束条件,并且行约束条件和这些条件完全可以放在一起,于是我就选择了相对容易理解的子集树作为解空间结构。

#include<iostream>
#include<queue>
#include<cmath>
#include<vector>
#include<fstream>
#include<sstream>
using namespace std;
 
//定义一个节点类
struct Node{
	int number;
	vector<int>x;//保存当前解 
}; 
 
//定义一个Queen的类 
class Queen{
	friend int nQueen(int);
	public:
		bool Place(Node q,int n);
		void Research();
		int n;//皇后个数
		int *bestx;//最优解
}; 
 
//判断是否能够放置的函数 
bool Queen::Place(Node q,int n)
{
	for(int j=1;j<n;j++)
	  if((abs(n-j)==abs(q.x[j]-q.x[n]))||(q.x[j]==q.x[n])) return false;
	return true;
}
 
void Queen::Research()
{
	queue<Node>Q;//活节点队列
	Node sign;
	sign.number=-1;
	Q.push(sign);//同层节点尾部标志
	int t=1;//当前节点所处的层
	Node Ew;//当前扩展节点 
	Ew.number=0; 
	//搜索子集空间树
	while(1){	
	   //检查所有的孩子节点 
	   for(int k=1;k<=n;k++){
		//把当前扩展节点的值赋给下一个节点 
		Node q;
	        q.number=t; 
	        q.x.push_back(0);//第一个位置为0 
    	        for(int i=1;i<t;i++) q.x.push_back(Ew.x[i]);
    	        q.x.push_back(k);
		if(Place(q,t))
    	    	Q.push(q);
    	    }	 
		//取下一扩展节点,取出,赋值给Ew 
		Ew=Q.front();
		Q.pop();
		if(Ew.number==-1){
		    //同层节点尾部标记
		    t++;//进入下一层 
		    Q.push(sign);//增加标记
		    //继续往下去下一个节点 
		    Ew=Q.front();
		    Q.pop();
		}		
		if(Ew.number==n){//找到最后一层的节点 
		   for(int i=0;i<=n;i++) bestx[i]=Ew.x[i];
		   break;
		} 
	}
}
 
int nQueen(int n)
{
	Queen X;
	X.n=n;	
	X.bestx=new int[n+1];
	for(int i=0;i<=n;i++) X.bestx[i]=0;
	X.Research();
	for(int i=1;i<=n;i++){
		cout<<X.bestx[i]<<" ";
	}
}
 
int main(){
	int N;
	cout<<"输入方格的行数:"; 
	cin>>N;	
	cout<<"输出计算的彼此不受攻击的n个皇后的一个方案:"; 
	nQueen(N);
	
	
	return 0;
}

在这里插入图片描述

n皇后最快算法详解 n皇后问题再经典不过了,想必大家也听说过。 再简单说一下吧,就是一个n*n的棋盘,放置n个皇后,使得竖着不攻击,横着不攻击,斜着不攻击。求有多少种方法。 (国际象棋不是这么玩的呀 ) 向来网上都是经典的题目配经典的解法,用一个矩阵记录哪里放了,回溯一下,每一次遍历每一个皇后,判断会不会被攻击。。。 然而,比蜗牛????还慢!!数据大一丁点,宇宙毁灭了都算不完,可见得有多慢啊!! 复杂度为:O(nn)你说可怕不可怕 刚刚算一个19皇后,就算神威·太湖之光也得算个差不多7个月,太可怕了!! (⊙o⊙) 能不能 阅读详情

相关推荐

算法设计和分析课程设计报告

文章目录1. 题目2. 目的3. 内容4. 需求分析5. 逻辑结构设计6.算法详细设计7.编码与调试8. 算法改进,优化方法10.总结,心得体会 课程设计报告要求 1. 题目 01背包问题 给定 N件物品和一个容量V的背包,第a件物品 体积为V 价值为wi,求将那些物品放入背包,可使得物品体积不超过背包容量,且总价值最大。 2. 目的 课程设计的目的是训练学生灵活应用所学数据结构知识,独立完成问题分析、总体设计、详细设计和编程实现等软件开发全过程的综合实践能力。巩固、深化学生的理论知识,提高

不想起标题 1万+

回溯法--n皇后问题

经典的n皇后问题 回溯法有两个模板--子集树、排列树,他们有回溯法的共同特点:深度优先搜索,如果一条路走不通,再退回来(类似递归)

m0_56147044的博客 5416

算法设计与分析 回溯法 n皇后问题

在n*n格的棋盘上放置彼此不受攻击的n个皇后。按照国际向其的规则,皇后可以攻击同一行、同一列、同一斜线上的棋子。

算法设计与分析——回溯法——n皇后问题

一、什么是N皇后问题? 在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于再n×n的棋盘上放置n个皇后,任何2个皇后不妨在同一行或同一列或同一斜线上。 #include<iostream> using namespace std; class Queen{ public: bool Place(int k); void Backtrack(int t); int n;//皇后的个数 in

qq_50675813的博客 7794

Linux新手必看:FinalShell连接不上?从检查IP到配置固定地址的完整排错指南

本文为Linux新手提供了FinalShell连接失败的完整排错指南,涵盖IP检查、SSH服务状态、防火墙配置和静态IP设置等关键步骤。通过详细的命令行操作和配置示例,帮助用户快速解决远程连接问题,提升Linux使用效率。

weixin_30675247的博客 753

UMI刷盘机器人代码实战:从SLAM到Diffusion Policy的完整部署流程

本文详细解析了UMI(Universal Manipulation Interface)刷盘机器人从数据准备到真实部署的完整实战流程。通过SLAM处理视频数据生成三维轨迹,并训练Diffusion Policy模型,最终将策略部署到UR5机械臂与WSG50夹爪上,实现从模仿学习到物理执行的闭环。

weixin_29042035的博客 461

【算法设计zxd】第6章 回溯法

6.1 回溯法的设计技术 : 四皇后问题 皇后可以吃掉——同行 同列 对角线 活结点:可以生成子节点 扩展结点: 死结点:不能再进行子节点生成的 回溯法: 在约束条件下对解空间树进行深度优先搜索的过 程,并在搜索过程中剪去那些不满足条件的分支。 问题的解: 为n元组(X1 ,…,Xi,…Xn),其中Xi 选自有限集S·, 当选出一组值X=(x1 ,…,xi,…xn)能够使评价函数P(x1 ,…,xi,…xn ) 满足问题的某种约束条件或到达极值。 .

iivan_cpp的博客 980

Altera Cyclone4 EP4CE15F17C8核心板硬件设计避坑指南(附AD09工程文件)

本文深入解析Altera Cyclone4 EP4CE15F17C8核心板硬件设计中的关键问题与解决方案,涵盖电源架构优化、信号完整性处理、热设计及生产调试要点。特别提供经过验证的AD09工程文件,帮助开发者规避常见设计陷阱,提升FPGA项目的成功率与可靠性。

weixin_29159441的博客 296

算法设计与分析--期末复习重点总结

本文采用流行的c++语言作为算法描述手段,文中所列算法均已上机调试过。内容包括算法概要,递归与分治,动态规划,贪心算法,回溯法,分支限界法,随机算法。后续内容在一个月内更新,敬请期待。

qq_62795094的博客 1万+

机械臂标准DH建模及正运动学分析(以IRB4600型工业机械臂为例)

对于工业机械臂而言,运动学是不考虑力学特性的情况下对机械臂的几何参数与其位置、速度、加速度等运动特性的关系研究。DH建模是运动学的基础,全称为Denavit-Hartenberg建模方法,是一种广泛应用于机器人运动学中的建模技术。该方法通过在每个连杆上建立坐标系,并利用齐次坐标变换来实现连杆之间的坐标转换。通过依次变换,可以推导出末端执行器相对于基坐标系的位姿,从而建立机器人的运动学方程。以IRB4600型六自由度工业机械臂为例,选择标准DH建模方法,建立其正运动学模型。

chen_mp的博客 1万+

生成自定义工具栏

我们生成了和VBA时代几乎一样的常用的工具栏。用WPF也可以完成以后的插件开发,界面控件编写基本靠自己绘画,还有用代码去控制,代码结构像HTML,做过网站的应该可以很快入手。其它后台C#代码除了对控件代码的控制外,和WinForm基本相同,但目前来看用WPF是生成自定义工具栏的较好的办法。当然,你也可以在工具栏命令中调用WinForm程序,对Coreldraw进行操作,这也应该是比较高效的办法,下次会讨论。资源的加入是本次调试的难点之一,我们的目标是让图片资源嵌入到程序中去,不必去电脑文件目录去调用;

力先生C#程序开发 1374

N皇后问题:回溯与分支限界算法深度解析(附实战代码模板)

本文深度解析N皇后问题的回溯法与分支限界法,提供详细的算法实现和优化技巧。通过对比两种算法的性能差异,帮助开发者选择最适合的解决方案,并附有实战代码模板,适用于约束满足问题的求解。

weixin_30664051的博客 581

matlab 计算InSAR干涉相位图的残差点

在理想的情况下,相位场是连续的,图像内沿着任何一条封闭曲线的积分应该为零。这样的连续场称为无旋场,反之为有旋场。但在实际测量过程中,由于噪声、欠采样和系统误差等因素的影响,得到的 InSAR 干涉相位条纹图中往往会出现不连续的相位点,即残差点

点云侠的博客 266

几种经典算法回顾

今天无意中从箱子里发现了大学时学算法的教材《算法设计与分析》,虽然工作这么几年没在什么地方用过算法,但算法的思想还是影响深刻的,可以在系统设计时提供一些思路。大致翻了翻,重温了一下几种几种经典的算法,做一下小结。分治法动态规划贪心算法回溯法分支限界法分治法1)基本思想将一个问题分解为多个规模较小的子问题,这些子问题互相独立并与原问题解决方法相同。递归解这些子问题,然后将这各子问题的解合并得到原问题的解。2)适用问题的特征该问题的规模缩小到一定的程度就可以容易地解决该问题可以分解为若干个规模较小的相同问题,即

走向架构师之路 1万+

STM32 BOOTLOADER配置以及APP跳转实现(裸机)

Bootloader是硬件启动的引导程序,是运行操作系统的前提。在操作系统内核或用户应用程序运行之前运行的一段小代码。对硬件进行相应的初始化和设定,最终为操作系统准备好环境。APP就是我们的应用程序,经过硬件引导程序之后跳转到系统程序运行。

吻等离子的博客 3355

基于SSD2828和STM32的MIPI显示屏驱动系统设计与实现

在硬件层面,需要将STM32、SSD2828和MIPI显示屏连接起来。STM32与SSD2828的连接:通过SPI接口连接STM32和SSD2828,用于配置和控制SSD2828。SSD2828与MIPI显示屏的连接:通过MIPI DSI接口连接SSD2828和MIPI显示屏,用于传输显示数据。

qq_38334677的博客 7143

算法分析与设计复习笔记

文章目录算法分析与设计复习绪论分治法动态规划(简答题画表格)贪心算法回溯法分支限界法(简答题画树) 算法分析与设计复习 绪论 算法复杂度是算法运行所需要的计算机资源的量,需要时间资源的量称为时间复杂度,需要空间资源的量称为空间复杂度 大O符号: f(n)=O(g(n))读作f(n)是g(n)的大O,g(n)是f(n)的渐进上界。 例:7n-2是O(n),读作7n-2是n的大O,n是7n-2的一个上界。 log(n²)是O(log(n)),log(n)是log(n²)的一个上界 常数c < logn &

weixin_45918211的博客 2083

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

c语言给出边的信息求顶点数,已公布算法设计与分析期末试卷A卷完整答案.pdf

已公布算法设计与分析期末试卷A卷完整答案.pdf1 装订线 华南农业大学期末考试试卷华南农业大学期末考试试卷A 卷卷 2010 学年第学年第一一学期学期 考试科目考试科目 算法分析与设计 考试类型考试类型 闭卷闭卷考试考试 考试时间考试时间 120 分钟分钟 学号 姓名 年级专业 题号题号 一一 二二 三三 四四 总分总分 得分得分 评阅人评阅人 注意注意所有答案请写在答卷上所有答案请写在答卷上写...

weixin_30965253的博客 237

IEM模型,地表粗糙度模拟

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

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

算法分析与设计复习重点

算法分析与设计复习重点(不会做的千万不要空着,特别是伪代码的题,凑都要凑满,这样老师好操作)考试成绩占50% 一、简答题(30分,基本概念) 1.什么是P问题 2.什么是NP问题 3.什么是NPC问题 (1)P类问题:所有可以在多项式时间内求解的判定问题构成P类问题 (2)NP类问题:所有的非确定性多项式时间可解的判定问题构成NP类问题。 (3)NPC问题:NP中的某些问题的复杂性与整个类的复杂性相关联.这些问题中任何一个如果存在多项式时间的算法,那么所有NP问题都是多项式时间可解的.这些问题被称为NP-

QT-Smile 1482

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

高级算法设计与分析(五) -- 回溯法

tips:这里只是 总结 ,不是教程哈。鉴于本人写字如画符,就不出视频教程了,如实在有需要,请在文章下方留言。为了方便知识与题目对照,本文章分为知识篇,和题型篇,先看知识在看题型食用更佳哦。有些不重要的知识,时间不充裕的可以不用看,我会在标题前面加“ *** ”标注,可自行跳过。思维导图放在第一篇文章最下面,请自行获取最小着色数3,

zqx1473的博客 1548

N皇后问题-分支限界法-c++代码

【代码】N皇后问题-分支限界法-c++代码。

whopxx的博客 281

《算法设计与分析》期末不挂科

考前知识点整理算法分析基础算法的定义算法正确性算法的性质程序的定义程序与算法的区别算法设计和分析的步骤复杂度分析算法的时间复杂性算法渐近复杂性渐近分析的记号渐近上界记号渐近下界记号非紧上界记号非紧下界记号紧渐近界记号意义算法分析中常见的复杂性函数 我们学校开设的这门课,过于理论,实践太少,考试不会太难,一起学习,一起不挂科! 但是算法平时一定要练哦!加油! 算法分析基础 算法的定义 算法是指解决问题的一种方法或一个过程。 算法是若干指令的有穷序列。 算法正确性 对每一个输入实例算法都能终止,并给出

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 8万+

N皇后问题(分支限界法)

N皇后问题(分支限界法)

m0_65508678的博客 5768

算法分析与设计——实验5:分支限界法

1、使用分支限界算法解决单源最短路径问题。 2、使用分支限界算法解决0-1背包问题。 3、在N*N的棋盘上放置彼此不受攻击的N个皇后,按照国际象棋的规则,皇后可以攻击与之处于同一行或同一列或同一斜线上的棋子。N皇后的问题等价于在N*N大小的棋盘中放置N个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。使用队列式分支限界法,求出N个皇后的一种放置方案。

阮阮的阮阮的博客 2754

n皇后问题(分支限界法)

一、问题描述 *问题描述:在n*n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n皇后问题等价于在n*n的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。 *算法设计:设计一个解n皇后问题的队列式分支限界法,计算在n*n个方格上放置彼此不受攻击的n个皇后的一个放置方案。 *数据输入:由文件input.txt给...

Alexwym的博客 3万+

【算法设计与分析】第6章02 分支限界法

分支限界法的设计技术 分支限界法: 增加约束条件,剪掉解空间中更多分支, 加快算法的执行速度。  约束条件 (1)上界函数:用来求得以当前结点为根的可行性解可能达到的极值【估测】。 (2)限界值:搜索到某一结点时,已经得到可行解或可能包含可行性解的最优值。 (3)评价函数:判定当前所获得路径或值是否为解的函数  剪枝 (1)该结点的上界小于界限值,即再往下搜索也不可能有更优的值。【以该节点为根的子树】 (2)该结点无法代表任何可行解,因为它已经违反了问题的约束,不能满足评价函数..

iivan_cpp的博客 5289
上一篇: 算法设计与分析——回溯法——01背包问题
下一篇: 算法设计与分析——算法思想总结
943802606
博客等级 码龄6年 1万+粉丝 177原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值