BFS广度优先搜索解决迷宫问题

news2024/11/25 7:44:05

前言

BFS广度优先搜索解决迷宫问题


迷宫问题

原题目:迷宫由n行m列的单元格组成(n,m都小于等于50),每个单元格要吗是空地要吗是障碍物。现在请你找到一条从起点到终点的最短路径长度。
在这里插入图片描述

分析

首先我们将起点入队,
然后队首节点可拓展的点入队,如果没有可拓展的点,将队首节点出队。重复该步骤直到达到目标位置或者队列为空。
在这里插入图片描述

代码如下:

#include <bits/stdc++.h>
using namespace std;

const int MAX = 100; // 定义最大矩阵大小
int a[MAX][MAX], v[MAX][MAX]; // a 用于存储迷宫地图,v 用于记录访问状态

// 定义点结构体
struct point {
    int x;    // 点的 x 坐标
    int y;    // 点的 y 坐标
    int step; // 从起点到达该点的步数
};

queue<point> r; // 申请队列,用于 BFS 遍历
int dx[4] = {0, 1, 0, -1}; // 四个方向的 x 偏移量(右、下、左、上)
int dy[4] = {1, 0, -1, 0}; // 四个方向的 y 偏移量(右、下、左、上)
/*
5 4
1 1 0 1
1 1 1 1
1 1 0 1
1 0 1 1
1 1 1 0
1 1 4 3
*/
int main() {
    int n, m; // 迷宫的行数和列数
    int startx, starty; // 起点的坐标
    int endx, endy; // 终点的坐标

    // 读取迷宫的行数和列数
    cin >> n >> m;
    
    // 初始化 v 数组,所有点的访问状态都设为 0(未访问)
    for(int i = 0; i < MAX; i++) {
        for(int j = 0; j < MAX; j++) {
            v[i][j] = 0;
        }
    }
    
    // 读取迷宫地图
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            cin >> a[i][j];
        }
    }
    
    // 读取起点和终点的坐标
    cin >> startx >> starty >> endx >> endy;
    
    // 初始化 BFS 的起点
    point start;
    start.x = startx;
    start.y = starty;
    start.step = 0; // 起点的步数为 0
    r.push(start); // 将起点入队
    v[startx][starty] = 1; // 标记起点为已访问
    int flag = 0; // 标记是否找到路径

    // 开始 BFS 遍历
    while(!r.empty()) {
        int x = r.front().x; // 当前点的 x 坐标
        int y = r.front().y; // 当前点的 y 坐标
        int step = r.front().step; // 当前点的步数
        r.pop(); // 取出队首元素
        
        // 如果当前点是终点,输出步数并终止
        if(x == endx && y == endy) {
            flag = 1;
            cout << step << endl;
            break;
        }
        
        // 遍历四个方向
        for(int k = 0; k < 4; k++) {
            int tx = x + dx[k]; // 计算新点的 x 坐标
            int ty = y + dy[k]; // 计算新点的 y 坐标
            
            // 确保新点在合法范围内
            if(tx >= 1 && tx <= n && ty >= 1 && ty <= m) {
                // 如果新点是可通行的且未访问过
                if(a[tx][ty] == 1 && v[tx][ty] == 0) {
                    // 更新新点的坐标和步数
                    point temp;
                    temp.x = tx;
                    temp.y = ty;
                    temp.step = step + 1;
                    r.push(temp); // 将新点入队
                    v[tx][ty] = 1; // 标记新点为已访问
                }
            }
        }
    }
    
    // 如果没有找到路径,输出提示信息
    if(flag == 0) {
        cout << "没有路径" << endl;
    }
    
    return 0;
}

BFS和DFS的区别

广度优先搜索:将队首结点可以拓展的点入队,如果没有可以拓展的点,将队首结点出队。重复上述步骤,直到到达目标位置或者队列为空。BFS搜索到的结果一定是最短的。BFS运用到了队列。
深度优先搜索: (从某点出发,沿着一个方向往下试探,当找到目标位置,还需回溯,以便找到所有的路径,再比较最短的路径,比较盲目,效率没有BFS高。DFS运用到了栈。

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

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

相关文章

总线性能指标及标准

一、总线性能指标 1.总线周期 一次总线操作所需的时间&#xff08;包括申请阶段、寻址阶段、传输阶段和结束阶段&#xff09;&#xff0c;通常 由若干个总线时钟周期构成。 2.总线时钟周期 即机器的时钟周期。计算机有一个统一的时钟&#xff0c;以控制整个计算机的各个部件…

Android 系统下:普通应用无缝安装,Launcher 应用安装遭遇罕见障碍解析

目录 一、场景 1.1 错误分析 1.2 解决方法尝试 1.2.1 检查应用的安装位置 1.2.2 使用ADB安装 1.2.3 检查APK的签名 1.2.4 检查可用的内部存储空间 1.2.5 将应用程序安装到设备的内部存储空间 1.2.6 重置设备&#xff08;谨慎使用&#xff09; 1.2.7 获取Root权限&…

【Qt】选择器

选择器概况 QSS选择器支持以下几种&#xff1a; 选择器示例说明 全局选择器 * 选择所有的 widget. 类型选择器 (type selector) QPushButton 选择所有的 QPushButton 和 其⼦类 的控件. 类选择器 (class selector) .QPushButton 选择所有的 QPushButton 的控件. 不会选…

C++——STL(list类)

1.list的介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素…

一文400字看懂,如何评估系统负载指标load average

在linux系统输入指令top后可以看到系统近1分钟、近5分钟、近15分钟的平均负载。 但是很多人工作10年也未必知道这个指标的含义&#xff0c;到底多少表示系统已经忙不过来&#xff1f; 如图&#xff0c;最近1分钟、5分钟&#xff0c;15分钟系统平均负载分别是0.10&#xff0c;0…

什么是充放电测试?怎么测试电源的充放电性能?

对于需要不间断电源供应的电子系统而言&#xff0c;某些电源模块通过搭载电池来应对突发停电或其他系统故障。针对这些模块的电池性能保障&#xff0c;充放电测试显得尤为重要&#xff0c;它是确保电源稳定性的关键测试方法。 充放电测试原理 充放电测试是指通过模拟电池在实际…

还不知道ACP认证?那你真落后了

随着云计算技术的蓬勃发展&#xff0c;已经成为推动企业数字化转型的关键力量。 在众多云服务提供商中&#xff0c;阿里云以其强大的技术实力和广泛的服务范围&#xff0c;在全球市场上占据了重要地位。对于IT专业人士而言&#xff0c;掌握云计算技能不仅是顺应技术潮流的需要&…

【笔记】1.4 特殊二极管

文章目录 一、稳压二极管1、稳压管的伏安特性和符号2、稳压管的主要参数&#xff08;1&#xff09;稳定电压 U Z U_Z UZ​&#xff08;2&#xff09;稳定电流 I Z I_Z IZ​&#xff08;3&#xff09;耗散功率 P M P_M PM​ 3、应用稳压管应注意的问题例&#xff1a;稳压二极管的…

一文读懂多组学联合分析产品在医学领域的应用

疾病的发生和发展通常涉及多个层面的生物学过程&#xff0c;包括基因表达、蛋白质功能、代谢物变化等。传统的单一组学研究只能提供某一层面的信息&#xff0c;而多组学关联分析能够综合多个层面的数据&#xff0c;提供更全面、更深入的疾病理解。例如&#xff0c;通过分析患者…

828华为云征文|华为云Flexus云服务器X实例之openEuler系统下搭建k3s轻量级kubernetes环境

828华为云征文&#xff5c;华为云Flexus云服务器X实例之openEuler系统下搭建k3s轻量级kubernetes环境 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、K3s介绍2.1 K3s简介2.2 K3s主要特点2.3 k3s…

Bonree ONE 3.0 助力企业加速驶入“全域可观测”新时代

发展新质生产力是我国目前推动高质量发展的内在要求和重要着力点。在这一背景下&#xff0c;基于信息技术及关键生产要素数据&#xff0c;推进企业数智化转型&#xff0c;成为形成新质生产力的关键路径。当前&#xff0c;随着企业业务的不断扩展和复杂化&#xff0c;企业对数据…

Linux本地部署DbGate结合内网穿透工具实现无公网IP远程管理数据库

文章目录 前言1. 安装Docker2. 使用Docker拉取DbGate镜像3. 创建并启动DbGate容器4. 本地连接测试5. 公网远程访问本地DbGate容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 前言 本文主要介绍如何在Linux Ubuntu系统中使用Docker部署DbGate数…

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel与内核进程

kernel起始与ENTRY(stext)&#xff0c;和uboot一样&#xff0c;都是从汇编阶段开始的&#xff0c;因为对于kernel而言&#xff0c;还没进行栈的维护&#xff0c;所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。 内核起始部分代码被解压代码调用&#xff0c…

labview串口大数据量报错的一种解决思路(通过tcp进行写入和读取串口数据)

因为项目要求&#xff0c;用labview给客户开发了一个上位机&#xff0c;在现场给客户调试上位机时&#xff0c;发现了几种奇怪的现象 1&#xff1a;客户样件有两路串口&#xff0c;一路串口可以多字节进行发送数据&#xff0c;一路只能单字节发送数据&#xff0c;每次单字节数据…

k8s--pod控制器--1

Pod控制器介绍 Pod是kubernetes的最小管理单元&#xff0c;在kubernetes中&#xff0c;按照pod的创建方式可以将其分为两类&#xff1a; 自主式pod&#xff1a;kubernetes直接创建出来的Pod&#xff0c;这种pod删除后就没有了&#xff0c;也不会重建 控制器创建的pod&#xf…

Vue: 创建vue项目

目录 一.创建项目 二.项目添加 三.添加成功 一.创建项目 打开本机终端输入npm create vuelatest 二.项目添加 1. 项目名称&#xff1a; Project name: one_vue 2.是否添加TypeScript支持&#xff1a;Add TypeScript? Yes 3.是否添加JSX支持&#xff1a;Add JSX Suppor…

基于SpringBoot的点餐平台网站

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架&#xff0c;Java技术 工具&#xff1a;IDEA/Eclipse、Navicat、Maven、Tomcat 系统…

【JAVA入门】Day41 - 字节缓冲流和字符缓冲流

【JAVA入门】Day41 - 字节缓冲流和字符缓冲流 文章目录 【JAVA入门】Day41 - 字节缓冲流和字符缓冲流一、缓冲流的体系结构二、字节缓冲流2.1 字节缓冲流提高效率的底层原理 三、字符缓冲流 在IO流体系中&#xff0c;FileInputStream&#xff0c;FileOutputStream&#xff0c;F…

Java企业面试题2

1.语言的分代&#xff1a; 第1代&#xff1a;机器语言 机器语言是最底层的计算机编程语言&#xff0c;它是由二进制数构成的一系列指令&#xff0c;直接与计算机硬件交互。每个二进制位模式代表一条特定的指令或数据地址。因为它是直接在硬件上执行的&#xff0c;所以运行效率…

如何增加Google收录量?

想增加Google收录量&#xff0c;首先自然是你的页面数量就要多&#xff0c;但这些页面的内容也绝对不能敷衍&#xff0c;你的网站都没多少页面&#xff0c;谷歌哪怕想收录都没办法&#xff0c;当然&#xff0c;这是一个过程&#xff0c;持续缓慢的增加页面&#xff0c;增加网站…