1213:八皇后问题 深度优先搜索算法

1213:八皇后问题

时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。

【输入】
(无)

【输出】
按给定顺序和格式输出所有八皇后问题的解(见样例)。

题目要求:不能是同一列、同一行、同一斜线(两个方向的对角线

思路:

  • 一个8*8的矩阵,用一个二维数组可以储存结果,也可以用一维数组(下标为n表示n行皇后的列数)
  • 从第一个开始搜索,搜索时判断在这一行之前的数是否有同一列、同一斜线(由于是for循环搜索,每次搜索就是一个同一行确定一个皇后,所以不存在同一行的冲突)
    • 用二维数组的话:同一列,统一斜线最简单的就是用三个for循环,去找同一列和对角线是否冲突,但是不太聪明的样子
    • 如果用一维数组的话:不难发现,只要一个for循环去判断是否该值和前面几行的值是否冲突就行。至于对角线不难发现:两行的差和两列的差的绝对值不相同,则不可能冲突即:abs(a[i]-a[l])==abs(i-l)
  • 一共有92种放置方式,但是可以分为按列放置(先看第一列皇后放在哪一行,再看第二列皇后放在哪一行,,,)和按行放置(先看第一行皇后放在哪一列,再看第二行皇后放在哪一列,,,)
  • 按行放置和按列放置最终结果排列有差异,但是内容一致,仔细观察会发现其实两种结果就是矩阵的转置即可得到,而当一维数组储存列数时,矩阵转置只需要下标和数组值对换就行
    代码示例:
#include<bits/stdc++.h>
using namespace std;
int n=8,num=1;
int a[9]={0};
void dfs(int l);
int check(int l);//判断同一列/同一行/一条斜线上是否已经有皇后,传入参数为第几行 
void print();
int main(){dfs(1);return 0;
} 
void print(){
//	按行输出 
//	for(int i=1;i<=n;i++){
//			for(int j=1;j<=n;j++){
//				if(j==a[i])	cout<<1<<" ";
//				else cout<<0<<" ";
//			}
//			cout<<endl;
//	}//按列输出 ,按列实质就是矩阵倒置,由于是一维数组储存 所以只需要将第n行m行转化为第m列的n行即可 int b[9];for(int i=1;i<=n;i++){b[a[i]]=i; }for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(j==b[i])	cout<<1<<" ";else cout<<0<<" ";}cout<<endl;}}
void dfs(int l){//先判断是否需要结束该次遍历if(l==n+1){cout<<"NO. "<<num<<endl;print();num++;return ;}else{//先循环遍历,i表示第几列 for(int i=1;i<=n;i++){a[l]=i;//直接先赋值,否则会出错 (他会往下继续判断,然后再搜索下一行,如果该位置判断有问题,会回退到上一行,)if(check(l)){  //判断 dfs(l+1);}}return;}
}
int check(int l){for(int i=1;i<l;i++){  //即在l-1行才确定皇后的位置,后面的就不需要遍历判断了 if((a[i]==a[l])||(abs(a[i]-a[l])==abs(i-l))) { //a[l]表示的当前行所在列数 return 0;}} return 1; 
}

问题实质为:搜索、回溯

搜索与回溯

  • 该搜索问题的实质是深度优先的算法(且为左根右):为了求得问题的解,先选择某一种可能情况开始搜索,在搜索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向下搜索,如此反复进行,直至得到解或证明无解。

  • 最终搜索的结果得到一个二叉树。而向下搜索的和回溯都可以利用递归去实现

  • 回溯是回到上一步然后再向下搜索,所以是基于第一次选择的条件下搜索,直到所有情况搜索完才会换到另外的选择继续搜索

    以下是二叉树搜索的过程,根节点表示满足条件的 结果(4次搜索完成)
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/592541.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring源码之依赖注入(二)

书接上文 文章目录 一. Autowire底层注入逻辑1. 属性注入逻辑 一. Autowire底层注入逻辑 前面我们分析了Spring时如何找到某个目标类的所有注入点这一个核心逻辑&#xff0c;但还没又对核心注入方法inject进行详细分析&#xff0c;下面我们就来详细分析Spring拿到所有的注入点…

【CASS精品教程】CASS11计算城镇建筑密度

CASS中可以很方便计算建筑密度。 文章目录 一、建筑密度介绍二、CASS计算建筑密度1. 绘制宗地范围2. 绘制建筑物3. 计算建筑密度三、注意事项一、建筑密度介绍 建筑密度(building density;building coverage ratio),指在一定范围内,建筑物的基底面积总和与占用地面积的比…

纠删码ReedSolomon

随着大数据技术的发展&#xff0c;HDFS作为Hadoop的核心模块之一得到了广泛的应用。为了数据的可靠性&#xff0c;HDFS通过多副本机制来保证。在HDFS中的每一份数据都有两个副本&#xff0c;1TB的原始数据需要占用3TB的磁盘空间&#xff0c;存储利用率只有1/3。而且系统中大部分…

Spring Boot 2.7.11 集成 GraphQL

GraphQL介绍 GraphQL&#xff08;Graph Query Language&#xff09;是一种用于API的查询语言和运行时环境&#xff0c;由Facebook于2012年创建并在2015年公开发布。与传统的RESTful API相比&#xff0c;GraphQL提供了更灵活、高效和强大的数据查询和操作方式。 以下是GraphQL…

Spring技术内幕笔记之SpringMvc

WebApplicationContext接口的类继承关系 org.springframework.web.context.ContextLoader#initWebApplicationContext 对IOC容器的初始化 SpringMvc如何设计 DispatcherServlet类继承关系 MVC处理流程图如下&#xff1a; DispatcherServlet的工作大致可以分为两个部分&#xf…

NFC物联网开发智能衣橱解决方案

智能衣橱是智能家居的重要内容&#xff0c;现代家居市场对家居智能化控制尤为重视。但是&#xff0c;传统家居生产功能和模式已经无法满足智能化时代的需求&#xff0c;所以家居智能化成为家居行业发展的主要需求。与传统衣橱对比&#xff0c;智能衣橱的功能强大方便人们的生活…

Android--Jetpack--WorkManager详解

2024已经到来&#xff0c;愿你安睡时&#xff0c;山河入梦。愿你醒来时&#xff0c;满目春风。愿你欢笑时&#xff0c;始终如一。愿你行进时&#xff0c;前程似锦&#xff0c;坦荡从容。 编程语言的未来&#xff1f; 目录 一&#xff0c;定义 二&#xff0c;特点 三&#xff0c…

‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。这个问题如何解决?

这个错误信息 vue-cli-service 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件 表示 vue-cli-service 命令在你的系统上未被识别。这通常是因为 Vue CLI 没有被正确安装或其路径没有被加入到系统的环境变量中。以下是几个解决这个问题的步骤&#xff1a; 确认 …

LinkedList与ArrayList的比较

1.LinkedList 基于双向链表&#xff0c;无需连续内存 随机访问慢&#xff08;要沿着链表遍历&#xff09; 头尾插入删除性能高 占用内存多 2.ArrayList 基于数组&#xff0c;需要连续内存 随机访问快&#xff08;指根据下标访问&#xff09; 尾部插入、删除性能可以&…

面试算法84:包含重复元素集合的全排列

题目 给定一个包含重复数字的集合&#xff0c;请找出它的所有全排列。例如&#xff0c;集合[1&#xff0c;1&#xff0c;2]有3个全排列&#xff0c;分别是[1&#xff0c;1&#xff0c;2]、[1&#xff0c;2&#xff0c;1]和[2&#xff0c;1&#xff0c;1]。 分析 下面采用回溯…

从0搭建github.io网页

点击跳转到&#x1f517;我的博客文章目录 从0搭建github.io网页 文章目录 从0搭建github.io网页1.成果展示1.1 网址和源码1.2 页面展示 2.new对象2.1 创建仓库 3.github.io仓库的初始化3.1 千里之行&#xff0c;始于足下3.2 _config.yml3.3 一点杂活 4.PerCheung.github.io.p…

如何为开源项目和社区做贡献 -- 你应该知道的十件事(四)——如何创建自己的开源项目?

问题四&#xff1a;如何创建自己的开源项目&#xff1f; 在前文中&#xff0c;我们已经介绍了最常见的给开源项目做贡献的两种途径&#xff0c;但随着你做开源项目的深入&#xff0c;你可能就会发现一个新的方向并推出自己的开源项目&#xff0c;下面&#xff0c;我将结合我的讲…

Linux 命令echo

命令作用 输出一行字符串在shell中&#xff0c;可以打印变量的值输出结果写入到文件在显示器上显示一段文字&#xff0c;起到提示的作用 语法 echo [选项] [字符串] 参数 字符含义-n不自动换行-e解释转义字符-E不解释转义字符 如果-e有效&#xff0c;则识别以下序列&…

SpringBoot 项目如何生成 swagger 文档

推荐使用 springdoc-openapi 的理由 1、springdoc-openapi 是 spring 官方出品&#xff0c;与 springboot 兼容更好&#xff08;springfox 兼容有坑&#xff09; 2、springdoc-openapi 社区更活跃&#xff0c;springfox 已经 2 年没更新了 3、springdoc-openapi 的注解更接近 …

力导向图与矩阵排序

Graph-layout force directed&#xff08;力导向图布局&#xff09;是一种用于可视化网络图的布局算法。它基于物理模型&#xff0c;模拟了图中节点之间的相互排斥和连接弹性&#xff0c;以生成具有良好可读性和美观性的图形布局。 在力导向图布局中&#xff0c;每个节点被视为…

(一)Matlab数值计算基础

目录 1.1Matlab命令组成 1.1.1基本符号 1.1.2功能符号 1.1.3常用命令 1.1Matlab命令组成 1.1.1基本符号 #提示运算符&#xff0c;表示软件处于准备就绪状态。在提示符号后输入一条命令或者一段程序后按Enter键&#xff0c;软件将给出相应的结果 >> *…

基于SpringBoot的影院订票系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的影院订票系统,java项目…

牛客练习赛50-C

题目描述 在一个游戏中&#xff0c;tokitsukaze需要在n个士兵中选出一些士兵组成一个团去打副本。 第i个士兵的战力为v[i]&#xff0c;团的战力是团内所有士兵的战力之和。 但是这些士兵有特殊的要求&#xff1a;如果选了第i个士兵&#xff0c;这个士兵希望团的人数不超过s[i]…

【Proteus仿真】【Arduino单片机】汽车尾气检测报警系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用按键、LCD1602液晶、蜂鸣器模块、CO、NOx、HC和PM2.5气体传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示CO、NOx、HC和…

手机录屏没有声音?让你的录屏有声有色

“有人知道手机录屏怎么录声音吗&#xff1f;今天录制了一个小时的直播视频&#xff0c;后面查看的时候发现没有声音&#xff0c;真的非常崩溃&#xff0c;想问问大家有没有办法&#xff0c;解决这个问题。” 在手机录屏的过程中&#xff0c;有时候我们可能会面临录制视频没有…