算法基础集训(第31天)------>BFS之经典【走迷宫】

news2024/11/15 13:49:11

一:概念定义

给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 01,其中 0 表示可以走的路,1 表示不可通过的墙壁。

最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。

请问,该人从左上角移动至右下角 (n,m) 处,至少需要移动多少次。

数据保证 (1,1) 处和 (n,m) 处的数字为 0,且一定至少存在一条通路。

简而言之:从起点到终点,中间有些路径有障碍物

二:题目描述

给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 01,其中 0 表示可以走的路,1 表示不可通过的墙壁。

最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。

请问,该人从左上角移动至右下角 (n,m) 处,至少需要移动多少次。

数据保证 (1,1) 处和 (n,m) 处的数字为 0,且一定至少存在一条通路。

输入格式

第一行包含两个整数 nm

接下来 n 行,每行包含 m 个整数(01),表示完整的二维数组迷宫。

输出格式

输出一个整数,表示从左上角移动至右下角的最少移动次数。

数据范围

1≤n,m≤100

输入样例

5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

输出样例

8

三:思路分析

走迷宫类型的问题(这题属于最短路类型的题目,采用bfs算法),几个重要的手段:

  1. 队列:用来存储合法点

  1. 距离数组:存储到起点的距离

  1. 地图数组:存储地图的数组

  1. 走路数组:分别用dx和dy两个数组表示上下左右四个方向的前进


四:万年无误代码模板(含思路解析)

#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

typedef pair<int, int> PII;

const int N = 110;

int n, m;
int g[N][N], d[N][N]; //g存放二维数组,d存放到左上角起点的距离

int bfs()
{
    queue<PII> q;

    memset(d, -1, sizeof d); //所有点到起点的距离初始化成-1
    d[0][0] = 0; //起点比较特殊
    q.push({0, 0}); //从起点开始bfs搜索

    int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}; // 分别是上下左右四个方向

    while (q.size())
    {
        auto t = q.front(); // 取出队头
        q.pop(); // 将队头弹出

        for (int i = 0; i < 4; i ++ ) // 遍历四个方向
        {
            int x = t.first + dx[i], y = t.second + dy[i];
            
            // 新的位置不超过地图范围且该点是0且该点没有被装入队列过
            if (x >= 0 && x < n && y >= 0 && y < m && g[x][y] == 0 && d[x][y] == -1)
            {
                d[x][y] = d[t.first][t.second] + 1; // 记录到起点的距离
                q.push({x, y}); // 将这个合法的点装入队列
            }
        }
    }

    return d[n - 1][m - 1]; // 返回右下角的点到起点的距离
}

int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i ++ )
        for (int j = 0; j < m; j ++ )
            cin >> g[i][j];

    cout << bfs() << endl;

    return 0;
}
创作不易,建议 点赞+收藏+关注,以免变成付费资源或者找不到宝贝文章了。
基础集训结束后将开展 拔高系列

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

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

相关文章

扎克伯格15年邮件曝光:AR/VR平台全盘细节,谈收购Unity的优势

近期一份2015年时扎克伯格的一封邮件曝光&#xff0c;文中解释了Facebook在VR领域的战略策略和VR对未来的影响等&#xff0c;揭露了但是Facebook在VR/AR方向上的全盘计划&#xff0c;同时曝光当时Facebook就有收购Unity的计划&#xff0c;值得一看。以下是摘要&#xff1a;1&am…

DarkNet框架实现分类任务避坑指南(附安装包)

声明&#xff1a;本文仅分享技术&#xff0c;无其他 文章目录***声明&#xff1a;本文仅分享技术&#xff0c;无其他***这个框架真的非常非常非常小众&#xff0c;入坑需谨慎DarkNet对编译环境有要求配置前的准备环节1、 DarkNet源码封装&#xff08;安装包如果失效了&#xff…

看这个就够了——ubuntu系统中的cuda cudnn cudatookit及pytorch使用

一.基本概念1.1 nvidia独立显卡独立显卡是指以独立板卡形式存在&#xff0c;可在具备显卡接口的主板上自由插拔的显卡。独立显卡具备单独的显存&#xff0c;不占用系统内存&#xff0c;而且技术上领先于集成显卡&#xff0c;能够提供更好的显示效果和运行性能。显卡作为电脑主机…

GooFuzz:一款基于OSINT方法的模糊测试工具

关于GooFuzz GooFuzz是一款基于OSINT方法的模糊测试工具&#xff0c;该工具基于Google Dork实现其功能。本质上来说&#xff0c;GooFuzz是一个Bash脚本&#xff0c;该脚本使用了Google Search技术来获取文件或目录中的敏感信息&#xff0c;而无需向目标Web服务器发送请求。 工…

ESP-IDF:字符和整形二维指针测试

ESP-IDF:字符和整形二维指针测试 /字符和整形二维指针测试/ void print19a(void ** cp) { cout<<"test char ** "<<endl; cout<<"cp "<<*((char **)cp)<<endl; char *s *((char **)cp); cout<<"cp "<&…

可信数字仓储(TDR)及其实践应用案例

数字资源长期保存活动是为了保存人类的科学文化遗产&#xff0c;为公众提供持续服务&#xff0c;并为未来提供历史证据。在对数字资源进行长期保存的过程中&#xff0c;不可避免地要面对环境、技术、人员等方面的改变&#xff0c;要让用户信任所获得的信息&#xff0c;保存活动…

华为车BU王军被停职,余承东独掌智能车业务丨HiEV独家

来自多个信息源的消息显示&#xff0c;华为智能汽车解决方案BU&#xff08;简称「车BU」&#xff09;正迎来多项人事调整。 据HiEV得知的信息&#xff0c;车BU COO、智能驾驶解决方案产品线总裁王军已被停职。这距王军最近一次公开露面&#xff0c;仅相隔半个月。1月14日&#…

haproxy相关

docker编译运行 创建Dockerfile文件FROM haproxy:2.6.8 COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg编译docker镜像 docker build -t my-haproxy .测试配置文件 docker run -it --rm --name haproxy-syntax-check my-haproxy haproxy -c -f /usr/local/etc/haproxy/…

【FreeRTOS】详细讲解FreeRTOS里中断管理并通过示例讲述其用法

文章目录中断函数解析FreeRTOS中断使用示例中断 大家看到中断后&#xff0c;有没有想到一个名词——异常呢&#xff1f;若大家想到了&#xff0c;但是记不起相关概念&#xff1b;或者是&#xff0c;大家没想到这个名词&#xff0c;没关系&#xff0c; 下面小编就给大家伙讲讲中…

VMware 虚拟机无法开机

在windows下安装VMware虚拟机&#xff0c;使用ubuntu18.04系统时&#xff0c;由于非正常关机或者硬盘内存不够&#xff0c;导致无法正常开机&#xff0c;现象如下&#xff1a;问题原因&#xff1a;第一&#xff1a;pillx4_smbus异常&#xff0c;需要禁用&#xff1b;第二&#…

全网最细------爬取4k高清大图

本次案例将教大家免费爬取4k高清大图&#xff0c;即使你是爬虫新手&#xff0c;也可以食用本次文章实现你的免费下载梦,话不多说&#xff0c;先看效果 网站视图: 看到这些图片你是否怦然心动&#xff0c;跟着我一起看下去. 一.思路分析 首先最基本的是获取每张图片的链接&a…

【JavaEE】并发编程(多线程)线程安全问题内存可见性指令重排序

目录 第一个问题&#xff1a;什么是线程安全问题&#xff1f; 第二个问题&#xff1a;为什么会出现线程安全问题&#xff1f; 第三个问题&#xff1a;如何解决多线程安全问题&#xff1f; 第四个问题&#xff1a;产生线程不安全的原因有哪些&#xff1f; 第五个问题&am…

模板进阶(包含特化)

非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数当成常量…

CSS(基础,面试,常见用例)

CSS规则【*】CSS选择器一、 CSS选择器二、选择器匹配原理三、优先级 / 权重四、可继承 / 不可继承样式属性【*】盒模型一、盒模型二、box-sizing属性三、offsetWidth、clientWidth、scrollWidth**【*】em/px/rem/vh/vw的区别一、CSS单位二、px三、em四、rem五、vh、vw六、%百分…

基于spring生态的基础后端开发及渗透测试流程

这是一篇记录如何从建仓开始到最后安全测试完整流程的笔记&#xff0c;使用的spring生态&#xff0c;目的是为spring的基础后端开发及后期渗透测试打一个模板。本篇采用springSecurity作为安全框架&#xff0c;搭载了redis-cache、spring-valid等功能&#xff0c;并开放了OAuth…

实测十款连锁店管理系统,专为纠结的连锁店老板打造!

普通的数据工具、人工管理难以满足连锁店老板们的需求&#xff0c;正所谓“有需求就有市场”&#xff0c;随着连锁店、加盟店如雨后春笋般在城市里出现&#xff0c;连锁店管理系统也越来越多。究竟哪一款连锁店管理系统&#xff0c;才能满足老板们的需求&#xff1f;不用纠结了…

park unpark 原理

1、基本使用 // 暂停当前线程 LockSupport.park();// 恢复某个线程的运行 LockSupport.unpark(暂停线程对象) 先 park 再 unpark public class Test1 {public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(() -> {log.debug(&q…

「自控元件及线路」1.2 电机中的磁性材料与磁场

本节介绍磁性材料的性能、分类 本节介绍电机中永磁材料的工作曲线 本节介绍电机中主磁极、电枢的磁场及电枢反应 文章目录磁性材料的基本概念磁性材料的磁性能高导磁性 饱和性 磁滞性 非线性温度特性 电阻率特性铁耗磁性材料的分类电机中的永磁材料永磁电机概述永磁材料的磁性能…

mysql:聊聊mysql学完之后心得,从哪里学,学哪些,怎么选课程,学到什么程度。

mysql&#xff1a;聊聊mysql学完之后心得&#xff0c;从哪里学&#xff0c;学哪些&#xff0c;怎么选课程&#xff0c;学到什么程度。 学习完一套课程之后习惯性总结一下。首先说一下&#xff0c;咕咕是跟着尚硅谷的康老师学习的mysql&#xff0c;大家想学习的话可以直接去b站…

Java文件IO操作及案例

文章目录一. 文件概述1. 狭义和广义上的文件2. 文件的分类3. 文件的路径二. 针对文件系统的操作1. File类的属性和构造2. File类的获取操作3. File类的判断操作4. 文件的创建和删除5. 其他的常用方法三. 对文件内容进行读写1. IO流对象2. 文件的读操作3. 文件的写操作4. Scanne…