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.hqwc.cn/news/315309.html

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

相关文章

009、引用

1. 引用与借用 下面的示例重新定义了一个新的 calculate_length 函数。与之前不同的是&#xff0c;新的函数签名使用了 String 的引用作为参数而没有直接转移值的所有权&#xff1a; fn main() { let s1 String::from("hello"); let len calculate_length(&s1…

Python实现的面部健康特征识别系统

Python实现的面部健康特征识别系统 引言1. 数据集获取与准备2. 模型训练3. Flask框架的应用4. 前台识别测试界面 结论与展望 引言 本文将介绍一个基于Python的面部健康特征判别系统&#xff0c;该系统利用互联网获取的公开数据集&#xff0c;分为健康、亚健康和不健康三个类别…

从零开始配置pwn环境:CTF PWN 做题环境

前期在kali2023环境安装的pwndocker使用发现不好用&#xff0c;so找了网上配置好pwn环境的虚拟机。 GitHub - giantbranch/pwn-env-init: CTF PWN 做题环境一键搭建脚本 可以直接下载我配置好的Ubuntu 16.04&#xff0c;为VMware导出的ovf格式 链接&#xff1a;百度网盘 请输…

Spring MVC - Controller的创建与使用

控制器Controller是处理器&#xff0c;是真正处理请求的组件 1 创建Controller 一般在src/main/java/com/qdu下建立一个controller包用来存放所有控制器。当创建一个控制器时&#xff0c;首先要记得使用Controller标记将该类注册成为一个控制器类。 然后在SpringMVCConfig类…

代码随想录算法训练营Day16 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

LeetCode 654 最大二叉树 本题思路&#xff1a;我们可以看到每次其实这个找最大值&#xff0c;然后创建节点的过程就是一个二叉树的前序遍历的过程。所以&#xff0c;我们可以递归来完成它。 先创找到数组中&#xff0c;最大的值的下标&#xff0c;然后创建根节点然后根据下标…

24年上半年想考软考,小白如何备考?

软考科目的考试时间&#xff1a; 软考考试时间&#xff1a; 软考高级有三科&#xff08;机考&#xff09;&#xff1a;《综合知识》、《案例分析》、《论文》 软考中级、初级&#xff08;机考&#xff09;&#xff1a; 《基础知识》、《应用技术》 考试报名官网&#xff1a;中…

【MPC学习笔记】02:MPC详细简介(Lecture 1_1 Unconstrained MPC)

本笔记来自北航诸兵老师的课程 课程地址&#xff1a;模型预测控制&#xff08;2022春&#xff09;lecture 1-1 Unconstrained MPC 接上一篇&#xff1a;【MPC学习笔记】01&#xff1a;MPC简介&#xff08;Lecture 1_1 Unconstrained MPC&#xff09; 文章目录 1 详细介绍1.1 状…

UTF-8编码文件:有BOM和无BOM的区别

UTF-8编码文件&#xff1a;有BOM和无BOM的区别 在处理UTF-8编码的文本文件时&#xff0c;你可能会遇到“有BOM”和“无BOM”两种类型。了解这两者之间的区别对于确保文件兼容性和正确的数据处理至关重要。 什么是BOM&#xff1f; BOM&#xff08;Byte Order Mark&#xff0c;…

B2005 字符三角形(python)

a input() print( a) print( a a a) print(a a a a a)python中默认输入的是字符型&#xff0c;第一句就是输入了一个字符赋给a python中单引号内的也是字符串&#xff0c;用print输出需要连接的字符串时用加号加在后面即可

一款集成 GPT 问答、Midjourney 绘画等一站式服务的免费开源系统

主要功能 集成 GPT 问答、Midjourney 绘画等一站式服务的系统&#xff0c;主要特点包括&#xff1a; 无需自行搭建 GPT 问答、Midjourney 服务 API&#xff0c;即开即用。支持 GPT 3.5/4.0、联网版、图像版问答&#xff0c;可免费体验。支持 Midjourney 快速、慢速、极速版多…

基于孔雀优化算法的航线规划

MATLAB2020a下正常运行 上传明细-CSDN创作中心

经典目标检测YOLO系列(一)复现YOLOV1(3)正样本的匹配及损失函数的实现

经典目标检测YOLO系列(一)复现YOLOV1(3)正样本的匹配及损失函数的实现 之前&#xff0c;我们依据《YOLO目标检测》(ISBN:9787115627094)一书&#xff0c;提出了新的YOLOV1架构&#xff0c;并解决前向推理过程中的两个问题&#xff0c;继续按照此书进行YOLOV1的复现。 经典目标…