深度优先搜索和广度优先搜索(C++、MATLAB代码迷宫应用)

news2024/11/19 23:35:59

深度优先搜索算法与广度优先搜索算法及其C++、MATLAB代码迷宫应用

  • 1. 深度优先搜索算法(DFS)
    • 1.1 深度优先搜索伪代码:
    • 1.2 案例应用:迷宫最小步数
      • 1.2.1 DFS算法MATLAB代码
      • 1.2.1 DFS算法C++代码
  • 2. 广度优先搜索算法(BFS)
    • 2.1 广度优先搜索伪代码:
    • 2.2 案例应用:迷宫最小步数
      • 2.2.1 BFS算法C++代码
  • 3. DFS与BFS的比较
  • 4. 共同缺点
  • 5. 结论


引言: 在计算机科学领域,搜索算法是一种基本的技术,用于解决各种问题,从图论中的路径查找到数据结构中的遍历。深度优先搜索(DFS)和广度优先搜索(BFS)是两种常用的搜索算法,它们在不同的情境下表现出色。本文将介绍这两种经典的搜索算法,以及它们的应用和差异,并附加中文伪代码来更好地理解算法。


1. 深度优先搜索算法(DFS)

深度优先搜索算法:一种用于遍历或搜索树或图的算法。通过探索一个路径的尽头,然后回溯到之前的节点,再继续探索其他路径的算法。这一过程可以看作是一种递归的方式,深入地搜索树的分支,直到找到目标或遍历完整棵树。

如图所示,注意观察搜索树的序号,总是优先探索可扩展节点的第一个节点,遇到障碍回溯到最近未探索节点
在这里插入图片描述

注意: 在非常深的搜索空间中,算法可能会陷入越来越深的搜索空间中(递归算法可能会递归得太深,以至于计算机耗尽内存)。为了避免这种陷阱,我们需要设置一个深度限制,使得算法可以在不超出一定深度的情况下进行回溯。该算法的这种变体称为深度有限搜索(Depth-limited search)。

1.1 深度优先搜索伪代码:

# 伪代码实现DFS
function dfs(node):
    if node is goal:
        return True  # 找到目标
    visited[node] = True
    for each neighbor of node:
        if not visited[neighbor]:
            if dfs(neighbor):
                return True
    return False

1.2 案例应用:迷宫最小步数

起点:1 1
终点:4 3
地图:0代表障碍物,1代表通道
1 1 0 1
1 1 1 1
1 1 0 1
1 0 1 1
1 1 1 0

求到达目标点的最小步数

1.2.1 DFS算法MATLAB代码

global min_step end_xy map mark direction
map=[1 1 0 1
     1 1 1 1
     1 1 0 1
     1 0 1 1
     1 1 1 0];
mark = zeros(size(map));
direction = [ 1   0
              0  -1
             -1   0
              0   1];
start_xy = [1 1];
end_xy = [4 3];
min_step = 9999; step = 0;
 
dfs(start_xy,step);
disp(min_step);

function dfs(point_xy,step)
    global min_step end_xy map mark direction;
    if point_xy(1) == end_xy(1) && point_xy(2) == end_xy(2)
        if min_step > step
            min_step = step;
        end
        return;
    end

    for i=1:4
        temp = point_xy+direction(i,:);
        if temp(1) < 1 || temp(1) > size(map,1) || temp(2) < 1|| temp(2) > size(map,2)
            continue;
        end
        if  map(temp(1),temp(2))==1 && mark(temp(1),temp(2)) == 0
            mark(temp(1),temp(2)) = 1;
            dfs(temp,step+1);
            mark(temp(1),temp(2)) = 0;
        end
    end
    return;
end


1.2.1 DFS算法C++代码

#include<cstdio>
using namespace std;
int start_x,start_y,end_x,end_y,width,height,min_step =9999;
int map[100][100]={0};  //1 表示通道 0 表示障碍物 
int mark[100][100]={0}; //1 表示访问 0 表示未访问 
int direction[4][2]={{1,0},{0,-1},{-1,0},{0,1}};
void dfs(int x, int y, unsigned int step)
{
	if(x == end_x && y == end_y)
	{
		if(step < min_step)
		{
			min_step = step;
		}
		return;	
	}
	
	for(int i=0; i<4; i++)
	{
		int temp_x = x+direction[i][0];
		int temp_y = y+direction[i][1];
		
		if (temp_x <1 || temp_y < 1 || temp_x > height || temp_y>width)
		    continue;
	    
		if(map[temp_x][temp_y]==1 && mark[temp_x][temp_y]==0)
		{
			mark[temp_x][temp_y] = 1;
			dfs(temp_x,temp_y,step+1);
			mark[temp_x][temp_y] = 0;
		}
	}
	return;
 } 
 
/*
5 4
1 1 4 3
1 1 0 1
1 1 1 1
1 1 0 1
1 0 1 1
1 1 1 0
*/
 
int main()
{	
	scanf("%d%d", &height,&width);
	scanf("%d%d%d%d", &start_x, &start_y, &end_x, &end_y);
    for(int i=1; i<=height; i++)
       for(int j=1; j<=width; j++)
          scanf("%d",&map[i][j]);

    mark[start_x][start_y] = 1;
    dfs(start_x, start_y, 0);
    
    printf("%d",min_step);
    return 0;
}

2. 广度优先搜索算法(BFS)

广度优先搜索算法是一种逐层扩展搜索的算法,它从起始节点开始,首先探索所有与该节点直接相连的节点,然后再探索这些节点的邻居节点,以此类推,直到找到目标或遍历整个图。

如图所示,注意观察搜索树的序号,总是优先探索可扩展节点的所有节点,直到找到目标或遍历整个图

在这里插入图片描述
注意: 在一个非常广阔的搜索空间中,这个算法可能会陷入存储一层的所有节点的困境,然后才能进入下一层。每层的节点数量呈指数增长。

2.1 广度优先搜索伪代码:

# 伪代码实现BFS
function bfs(start, goal):
    queue = Queue()
    queue.enqueue(start)
    visited = set()
    while not queue.isEmpty():
        node = queue.dequeue()
        if node == goal:
            return True  # 找到目标
        visited.add(node)
        for each neighbor of node:
            if neighbor not in visited and neighbor not in queue:
                queue.enqueue(neighbor)
    return False

2.2 案例应用:迷宫最小步数

起点:1 1
终点:4 3
地图:0代表障碍物,1代表通道
1 1 0 1
1 1 1 1
1 1 0 1
1 0 1 1
1 1 1 0

求到达目标点的最小步数

2.2.1 BFS算法C++代码

#include<cstdio> 
#include<queue>
using namespace std;
int start_x,start_y,end_x,end_y,width,height,step=0,min_step=9999; 
int map[100][100],mark[100][100];
int direction[4][2]={{1,0},{0,-1},{-1,0},{0,1}};
struct Point
{
	int x;
	int y;
	int step;
};
queue <Point> point;

int main()
{
	scanf("%d%d",&height,&width);
	scanf("%d%d%d%d",&start_x,&start_y,&end_x,&end_y);
	for(int i=1; i<=height; i++)
		for(int j =1; j<=width; j++)
			scanf("%d",&map[i][j]);
	
	//BFS
	Point start;
	start.x = start_x;
	start.y = start_y;
	start.step = step;
			
	point.push(start);
	mark[start_x][start_y] = 1;
	while(~point.empty())
	{
		int x = point.front().x;
		int y = point.front().y;
		int step = point.front().step;
		
		if (x == end_x && y == end_y)
		{
			min_step = step;
			break;
		}
		
		for(int i=0; i<4; i++)
		{
			int temp_x = x+direction[i][0];
			int temp_y = y+direction[i][1];
			
			if (temp_x <1 || temp_y < 1 || temp_x>height || temp_y>width)
				continue;
			
			if(map[temp_x][temp_y] == 1 && mark[temp_x][temp_y] == 0)
			{
				Point temp_point;
				temp_point.x = temp_x;
				temp_point.y = temp_y;
				temp_point.step = step + 1;
				point.push(temp_point);
				mark[temp_x][temp_y] = 1;
			}
		}
		point.pop();
	}
	printf("%d",min_step);
	return 0;
}


3. DFS与BFS的比较

  1. 性质:DFS是一种深度搜索,BFS是一种广度搜索。

  2. 搜索顺序:DFS沿着一条路径深入,然后回溯;BFS逐层扩展搜索。

  3. 解决问题:DFS适用于找到路径、拓扑排序等问题,而BFS适用于找到最短路径、连通性问题。

  4. 存储开销:DFS通常比BFS具有更小的存储开销,因为它只需要存储当前路径上的节点。

  5. 时间复杂度:在某些情况下,DFS可能需要更多的时间来找到解决方案,因为它可能会先陷入一个深度较大的分支。

4. 共同缺点

基本的深度优先和广度优先算法执行无信息搜索。它们会穷举地搜索树或图中的节点。他们不估算到达目标的特定路线的成本。当他们第一次找到目标时,他们会停下来。他们不一定能找到通往目标的最短路径。

5. 结论

深度优先搜索算法和广度优先搜索算法是解决各种问题的有力工具。选择使用哪种算法取决于问题的性质和要求。理解这两种算法的原理和特点,以及使用伪代码来帮助理解它们的实现细节,有助于我们更好地应用

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

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

相关文章

Redis主从复制(Redis6.2.5版本)

1、Redis单击服务问题&#xff1f; Redis的单机服务在实际的应用中会有很多的问题&#xff0c;所以在实际的使用中如果使用了redis服务&#xff0c;往往都不是单机服务&#xff0c;都会配置主从复制或者哨兵机制及redis的集群服务等。 Redis的单机服务&#xff0c;当主机发生机…

nbcio-boot移植到若依ruoyi-nbcio平台里一formdesigner部分(四)

到目前为止&#xff0c;虽然基础的formdesigner部分已经完成&#xff0c;但流程用formdesigner提交与审批过程中的显示还有问题。 1、后端部分 其中FormConf修改如下&#xff1a; package com.ruoyi.flowable.core;import lombok.Data;import java.util.List; import java.uti…

慢查询SQL如何优化

一.什么是慢SQL? 慢SQL指的是Mysql中执行比较慢的SQL,排查慢SQL最常用的方法是通过慢查询日志来查找慢SQL。Mysql的慢查询日志是Mysql提供的一种日志记录&#xff0c;它用来记录Mysql中响应时间超过long_query_time值的sql,long_query_time的默认时间为10s. 二.查看慢SQL是否…

华为云云耀云服务器L实例评测|基于云耀云服务器在Docker上部署nginx服务

文章目录 1、服务介绍云耀云服务器Docker介绍Docker-Compse介绍 2、在云耀云服务器安装Docker3、通过Docker run命令运行nginx服务4、在云耀云服务器安装docker-compose5、通过docker-compose方式启动nginx服务 1、服务介绍 云耀云服务器 云耀云服务器&#xff08;Hyper Elas…

ArcGIS 10.3安装教程!

软件介绍&#xff1a;ArcGIS是一款专业的电子地图信息编辑和开发软件&#xff0c;提供一种快速并且使用简单的方式浏览地理信息&#xff0c;无论是2D还是3D的信息。软件内置多种编辑工具&#xff0c;可以轻松的完成地图生产全过程&#xff0c;为地图分析和处理提供了新的解决方…

java高级:动态代理

动态代理介绍、准备功能 这节课我们学习一个Java的高级技术叫做动态代理。首先我们认识一下代理长什么样&#xff1f; 假设现在有一个明星坤坤&#xff0c;它有唱歌和跳舞的本领&#xff0c;作为明星是要用唱歌和跳舞来赚钱的&#xff0c;但是每次做节目&#xff0c;唱歌的时…

多线程和并发编程(3)—AQS和ReentrantLock实现的互斥锁

一、管程模型—MESA模型 管程是什么&#xff1f; 管程就是指管理共享变量&#xff0c;以及对共享变量的相关操作。 在管程的发展史上&#xff0c;先后出现过三种不同的管程模型&#xff0c;分别是Hasen模型、Hoare模型和MESA模型。现在正在广泛使用的是MESA模型。 MESA模型…

每日一博 - 反向代理、API 网关、负载均衡

文章目录 概述图解 概述 反向代理、API网关和负载均衡是在网络和服务器架构中用于不同目的的重要组件&#xff0c;它们有不同的功能和应用场景。以下是它们之间的区别和联系&#xff1a; 反向代理&#xff08;Reverse Proxy&#xff09;&#xff1a; 功能&#xff1a;反向代理…

Python 数据可视化:Seaborn 库的使用

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

u盘上面 安装 ubuntu 系统

u盘上面 安装 ubuntu 系统 下载 一个 Ubuntu 22.04.3 LTS 桌面版 https://ubuntu.com/download/desktop 找到一个U盘 参考文章&#xff1a; 把 Ubuntu 装到U盘里随身携带&#xff0c;并同时支持 BIOS 和 UEFI 启动 https://www.luogu.com.cn/blog/GGAutomaton/portable-ubu…

【数据结构】串的定义;存储结构;基本操作的实现

欢迎光~临~^_^ 目录 知识树 1、串的定义 2、串的存储结构 2.1顺序存储 静态存储 动态存储 2.2链式存储 2.3串的堆分配存储表示 3、串的基本操作 3.1求子串 3.2比较操作 3.3定位操作 4、C语言实现串的基本操作 知识树 1、串的定义 串是由零个或多个字符组成的…

Oracle,高斯创建自增序列

某些时候,需要获取到一个自增值 然后点击左下 Apply 也可以通过SQL语句执行 dual在Oracle中是张虚拟表&#xff0c;通常用于执行这样的查询 Oracle中查询语句: select 序列名.nextval from dual 在高斯数据库中:查询是 select my_sequence.nextval 不需要加form xxx 也…

微信小程序项目开发Day1

没接触过&#xff0c;直接看视频学习&#xff1a; 千锋教育微信小程序开发制作前端教程&#xff0c;零基础轻松入门玩转微信小程序_哔哩哔哩_bilibili千锋教育微信小程序开发制作前端教程&#xff0c;零基础轻松入门玩转微信小程序共计56条视频&#xff0c;包括&#xff1a;学…

20230914java面经记录

1.mq消息重复消费 2.mq消息堆积 3.如何实现消费的幂等性&#xff08;网站付款成功发货&#xff0c;使用mq做异步通知发货&#xff09; 4.log&#xff0c;debug&#xff0c;warn&#xff0c;error怎么用 5.java基础 6.效率问题 ArrayList a,b;HashSet c,d ;a,b,c,d各自有10…

GDB之修改字符串的值(十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

ESP32主板-MoonESP32

产品简介 Moon-ESP32主板&#xff0c;一款以双核芯片ESP32-E为主芯片的主控板&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;低功耗&#xff0c;板载LED指示灯&#xff0c;引出所有IO端口&#xff0c;并提供多个I2C端口、SPI端口、串行端口&#xff0c;方便连接&#xff0c;…

Claude 使用指南 | 可与GPT-4媲美的语言模型

本文全程干货&#xff0c;让你轻松使用上claude&#xff0c;这也是目前体验cluade的唯一途径&#xff01;废话不多说&#xff0c;直接上教程&#xff0c;cluade的能力不逊于GPT4&#xff0c;号称是ChatGPT4.0最强竞品。相对Chatgpt来说&#xff0c;Claude不仅是完全免费的&…

Prometheus存储容量估算和Prometheus联邦机制

Prometheus最受诟病的一点就是单机存储不好扩展。 Prometheus存储容量估算 根据老师的经验&#xff0c;每秒接收 80 万个数据点&#xff0c;算是一个比较健康的上限&#xff0c;因而一开始也无需用一台配置特别高的机器&#xff0c;随着数据量的增长&#xff0c;以后再升级硬…

图扑可视化图表组件之股票数据分析应用

股市是市场经济的必然产物&#xff0c;在一个国家的金融领域之中有着举足轻重的地位。在过去&#xff0c;人们对于市场走势的把握主要依赖于经验和直觉&#xff0c;往往容易受到主观因素的影响&#xff0c;导致决策上出现偏差。如今&#xff0c;通过数据可视化呈现&#xff0c;…

java 单元测试Junit

所谓单元测试&#xff0c;就是针对最小的功能单元&#xff0c;编写测试代码对其进行正确性测试。为了测试更加方便&#xff0c;有一些第三方的公司或者组织提供了很好用的测试框架&#xff0c;给开发者使用。这里介绍一种Junit测试框架。Junit是第三方公司开源出来的&#xff0…