深度优先(DFS) (例子:全排列,迷宫)

news2024/11/17 16:19:21

       深度搜索是一种计算机算法,用于在图或树等数据结构中查找目标节点。深度搜索从一个节点出发,依次遍历其所有子节点,直到找到目标节点或遍历完所有节点。如果找到目标节点,则搜索结束;如果遍历完所有节点仍未找到目标节点,则搜索失败。深度搜索通常使用递归实现,通过堆栈管理遍历的节点。深度搜索常用于解决迷宫、棋盘等问题,也是其他算法的核心组成部分,如搜索算法、动态规划等。 

模型:

void dfs(int step)

{

        判断边界

        for(int i=1;i<=n;i++)//尝试每种可能

             {

                  dfs(step+1);//继续下一步

              }
         reutn;//返回

        深度优先搜索(DFS)全排列的基本思路是对于一个长度为n的数组,从第1个位置开始(即起始状态),对于每个未选择的数字,在当前的位置上进行一次选择,然后向下递归直到找到一个完整的排列,然后回溯到当前状态,再选择下一个未选择的数字进行搜索。 

#include<iostream>//深度优先搜索,全排列为例子
using namespace std;
int book[100];//标记
int n;
int a[100];
void dfs(int step)
{
	int i;
	if (step == n + 1)//判断边界
	{
		for (int i = 1; i <= n; i++)
			cout << a[i]<<" ";
		cout << endl;
		return;
	}
	for (int i = 1; i <= n; i++)//每种可能
	{
		if (book[i] == 0)
		{
			a[step] = i;
			book[i] = 1;
			dfs(step + 1);//继续下一步
			book[i] = 0;
		}
	}
	return;
}
int main()
{
	cin >> n;
	dfs(1);
}

       深度搜索算法可以用于解决迷宫问题。将迷宫抽象成一个矩阵,每个格子表示一个节点。将起点节点入栈,然后遍历其所有相邻节点。如果相邻节点是通路,则将其入栈,并在矩阵中标记为已访问。如果相邻节点是终点,则搜索结束;如果所有相邻节点都是墙,或者已经访问过,则回溯到上一步节点。重复以上步骤,直到遍历完所有节点或者找到终点。

#include<iostream>//深度优先搜索,迷宫最短路径问题
using namespace std;
int book[51][51];//标记是否走过
int n,m,q,p,x,y;
int a[51][51];
int min1 = 9999;
int next1[4][2] = { {0,1},{1,0},{0,-1},{-1,0} };//右,下,左,上四个方向
void dfs(int x,int y,int step)
{
	int tx, ty;
	if (x == q && y == p)//走到终点
	{
		if (step < min1)
			min1 = step;
		return;
	}
	for (int k = 0; k < 4; k++)//向四个方向都走
	{
		tx = x + next1[k][0];
		ty = y + next1[k][1];
		if (tx<1 || tx>n || ty<1 || ty>m)
			continue;
		if (a[tx][ty] == 0 && book[tx][ty] == 0)//该条路不为障碍且没走过
		{
			book[tx][ty] = 1;//标记已走过
			dfs(tx, ty, step + 1);
			book[tx][ty] = 0;//尝试结束,取消标记
		}
	}
	return;
}
int main()
{
	cin >> n >> m;//迷宫规模
	for (int i = 1; i <= n; i++)//0为可走通路
		for (int j = 1; j <= m; j++)
			cin >> a[i][j];//输入迷宫
	cout << "输入起点,终点:" << endl;
	cin >> x >> y >> q >> p;//输入起点,终点
	book[x][y] = 1;//起点默认走过
	dfs(x,y,0);
	cout <<"最短路径为:"<< min1;
}

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

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

相关文章

文心一言 VS 讯飞星火 VS chatgpt (109)-- 算法导论10.1 7题

七、用go语言&#xff0c;说明如何用两个队列实现一个栈&#xff0c;并分析相关栈操作的运行时间。 文心一言&#xff1a; 在Go语言中&#xff0c;我们可以用两个队列&#xff08;queue1和queue2&#xff09;实现一个栈。以下是实现代码&#xff1a; package main import &…

拉绳位移传感器钢丝绳角度偏离过大就会减少使用寿命

拉绳位移传感器钢丝绳角度偏离过大就会减少使用寿命 拉绳位移传感器还有一种情况就是&#xff0c;如果钢丝绳在恶劣的环境中作业&#xff0c;磨损&#xff0c;挤压&#xff0c;弯折等非正常使用&#xff0c;也更容易使钢丝绳断裂。位移传感器在作业中&#xff0c;钢丝绳角度偏离…

【JavaEE初阶】 线程的状态和转移

文章目录 &#x1f332;线程的状态&#x1f340;观察线程的所有状态&#x1f38d;线程状态和状态转移的意义&#x1f38b;观察线程的状态和转移&#x1f4cc;观察 1:&#x1f4cc;观察 2:&#x1f4cc;观察-3: ⭕总结 &#x1f332;线程的状态 &#x1f340;观察线程的所有状态…

设计模式 - 解释器模式

目录 一. 前言 二. 实现 三. 优缺点 一. 前言 解释器模式&#xff08;Interpreter Pattern&#xff09;指给定一门语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;该解释器使用该表示来解释语言中的句子&#xff0c;属于行为型设计模式。是…

redis 事物

Redis事务 一个队列中&#xff0c;一次性、顺序性、排他性的执行一系列命令 正常执行 放弃事务 在exec执行之前&#xff0c;报错&#xff0c;则所有命令都不会执行 在exec执行后&#xff0c;报错&#xff0c;则其它正确的指令会执行&#xff0c;错误的命令会抛弃 watch 监…

一文搞懂二叉树先序遍历的三种方法

系列文章&#xff1a; 相关题目&#xff1a; 144. 二叉树的前序遍历 先序遍历结果为&#xff1a;1 2 4 5 3 6 7 总体上分为两种框架&#xff0c;递归框架和非递归框架&#xff0c;递归框架又分为两种思路&#xff1a;分解思路和遍历思路。 递归 1、分解思路 【分解为子问题】…

OLED透明拼接屏在乌海湖旅游区的应用探究

作为一名资深的OLED透明拼接屏工程师&#xff0c;我希望通过这篇文章来介绍一下OLED透明拼接屏在乌海这座城市中的表现&#xff0c;并对该城市的历史、景点、管辖范围进行简要介绍。 最后&#xff0c;我将讨论OLED透明拼接屏在乌海适用的行业和领域&#xff0c;并列举一些优缺…

在windows7中运行pycharm报错误“无法定位程序输入点 CreateAppContainerProfile 于动态链接库 USERENV.dll 上

截图&#xff1a; 解决办法&#xff1a; 一时不知道怎么办。一想之前是好好的&#xff0c;不知道被什么破坏了。所以恢复系统解决。

Prometheus集成consul[被监控对象开启basic认证]

1&#xff0c;被监控对象开启basic认证 具体操作这里不再详细细讲。 2&#xff0c;将被监控对象注册到consul 由于被监控对象开启了basic认证&#xff0c;注册到consul后显示&#xff1a;401 Unauthorized Output: Unauthorized&#xff0c;不能够正常健康检查。 3&#xff0c…

找不到d3dx9_35.dll,无法继续执行代码解决方法

今天&#xff0c;我要和大家分享&#xff1a;d3dx9_35.dll丢失怎么解决。 首先&#xff0c;我们需要了解什么是d3dx9_35.dll文件。d3dx9_35.dll是一个动态链接库文件&#xff0c;它是DirectX 9中的一个重要组件&#xff0c;通常被用于游戏和多媒体软件中。如果我们的电脑中缺少…

功能测试复习

一。测试流程 1.需求评审 确保各部门需求理解一致 2.计划编写 测什么&#xff0c;谁来测&#xff0c;怎么测 3.用例设计 验证项目是否符合需求的操作文档 4.用例执行 项目模块开发完成开始执行用例文档实施测试 5.缺陷管理 对缺陷进行…

图片上传并映射回显

目录 简介 代码展示 1、配置图片保存地址 2、拦截器配置映射地址 3、接口 简介 我们知道文件的上传就是把本地的文件上传到服务器上&#xff08;在服务器中指定地址保存&#xff09;&#xff1b;通过访问服务器地址去查看文件&#xff1b;但是直接通过域名和保存地址是无…

【单片机】17-温度传感器DS18B20

1.DS18B20相关背景知识 1.温度传感器 &#xff08;1&#xff09;测温度的方式&#xff1a;物理&#xff08;汞柱&#xff0c;气压&#xff09;&#xff0c;电子&#xff08;金属电性能随温度变化&#xff09; &#xff08;2&#xff09;早期&#xff1a;热敏电阻&#xff08;模…

青岛建筑模板厂家有哪些?

在青岛地区&#xff0c;有许多建筑模板厂家供应各类建筑模板材料。其中&#xff0c;一家备受认可的建筑模板厂家是广西贵港市的能强优品木业公司。该公司具备全面的生产能力和优质的产品质量&#xff0c;在青岛地区的建筑施工企业中有着广泛的合作经验。 能强优品木业公司提供全…

【密评】商用密码应用安全性评估从业人员考核题库(八)

商用密码应用安全性评估从业人员考核题库&#xff08;八&#xff09; 国密局给的参考题库5000道只是基础题&#xff0c;后续更新完5000还会继续更其他高质量题库&#xff0c;持续学习&#xff0c;共同进步。 1751 判断题 根据GM/T0016《智能密码钥匙密码应用接口规范》&#x…

【Vue面试题十二】、说说你对双向绑定的理解?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;双向数据绑定是什么 一、…

VMware Workstation Player 17 下载安装教程

虚拟机系列文章 VMware Workstation Player 17 免费下载安装教程 VMware Workstation 17 Pro 免费下载安装教程 windows server 2012安装教程 Ubuntu22.04.3安装教程 FTP服务器搭建 VMware Workstation Player 17 下载安装教程 虚拟机系列文章前言一、 VMware Workstation Pla…

是炒作还是大势所趋?电商企业7 种日渐盛行的 API 管理应用场景

17 世纪兴起的纸质货币改变了全球经济的面貌&#xff0c;开创了国际货币监管的新时代。货币能带来如此重大的颠覆&#xff0c;主要原因在于它有着标准化“交换媒介”的能力。在技术和数字化世界中&#xff0c;API 产生了类似的效果&#xff0c;它创建了标准化、可重复使用、安全…

CSS 中::after的妙用(实现在margin中显示内容)

效果图如下&#xff1a; 背景&#xff1a; 如上图&#xff0c;之前只是当纯的写一个参考货架平面图&#xff0c;用作物料系统的在库状态可视化&#xff0c;当完成页面body分成10等份时&#xff0c;货架之间需要有通道&#xff0c;为了实现实际的样式&#xff0c;我给每个等份都…

FPGA实现电机霍尔编码器模块

一. 简介 想要知道直流电机的转速&#xff0c;就需要用到编码器&#xff0c;常用的编码器有霍尔和光电两种&#xff0c;但是光电编码器比较贵(性能好于霍尔)&#xff0c;所以平常的时候使用最多的是霍尔编码器了。 霍尔编码器一般有AB两相信号输出&#xff0c;默认的时候为低…