走迷宫(BFS两种写法)

news2024/9/24 13:24:33
题目描述: 

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

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

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

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

输入格式

第一行包含两个整数 n和 m。

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

输出格式

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

数据范围

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

思路: 

根据算法的特性此题我们选择使用宽搜算法,逐层枚举,求出最短路径 。


根据上面的宽搜树,逐层开始搜索即可。 树根是(0,0)从此起点开始逐层开搜

第一层是(1,0),接着第二层是(2,0),第三层是(2,1)和(3,0)

第四层是(2,2),(4,0),第五层是(1,2)和 (4,1) 和(2,3)

第六层是(0,2).。。。。。。。。后面按照题目规则上下左右找就像,

这里有一个知识点就是如何能方便上下左右去走,这个时候就要设置一个上下左右的偏移量,设中间数是(x,y)往上走一个单位就是(x-1,y),往右走一个单位就是(x,y+1),往下走一个单位就是(x+1,y),往左走一个单位是(x,y-1);

大家可以结合此文上下两张图自己走一遍。树形式是方便我们更好的理解,实际实现是用一个队列实现。(个人理解)

 


AC代码: 

第一种手写队列: 
#include<iostream>
#include<algorithm>
#include<cstring>
#include<utility>

using namespace std;

typedef pair<int,int> PII;//定义一个二元组
const int N = 110;
int g[N][N];//存的地图
int d[N][N];//每个点到终点的距离
int n,m;
PII q[N*N],pre[N][N];//存坐标手写队列
//输出路径
void print(int x,int y)
{
    if(x==1 && y==1) return;
    auto t = pre[x][y];
    print(t.first,t.second);
    printf("%d %d\n",t.first,t.second);
}

int bfs(int a,int b)
{
    //队列的头,和尾(从1开始)
    int hh = 1,tt = 1;
    q[1] = {a,b};//存入第一个点,也是起点
    //把没走的点都标记成-1
    memset(d,-1,sizeof d);
    d[1][1] = 0;//起点开始走; 也就是所谓的第0步
    //设置上下左右偏移量
    int dx[4] = {-1,0,1,0},dy[4] = {0,1,0,-1};
    while(hh <= tt)
    {
        //取出队首元素
        auto t = q[hh++];
        for(int i=0;i<4;i++)
        {
            //算出上下左右能走的点的坐标
            int x = t.first + dx[i],y = t.second+dy[i];
            if(x >= 1 && y >= 1 && x<=n && y<=m && g[x][y] == 0 && d[x][y] == -1)
            {
                d[x][y] = d[t.first][t.second] + 1;
                pre[x][y] = t;//存储当前点的前驱节点
                q[++tt] = {x,y};//存当前下标.入队
            }
            
        }
    }
    return d[n][m];
}

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(0,0) << endl;
    return 0;
}

第二种直接使用stl中的queue
#include<iostream>
#include<algorithm>
#include<cstring>
#include <queue>
#include<utility>

using namespace std;

typedef pair<int, int> PII;
const int N = 110;
int g[N][N],d[N][N];
int n,m;

int bfs(int a,int b)
{
    queue<PII> q;
    q.push({a,b});
    memset(d,-1,sizeof d);
    d[0][0] = 0;
    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];
            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(0,0) << endl;
    return 0;
}

以上图片来源于B站董晓算法和acwing视频

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

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

相关文章

市场复盘总结 20240328

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 40% 最常用的…

2024 ccfcsp认证打卡 2023 03 02 垦田计划

import java.util.*;public class Main {public static void main(String[] args) {Scanner input new Scanner(System.in);int N 100100; // 定义一个较大的常数Nlong[] t new long[N]; // 存储任务的耗时long[] c new long[N]; // 存储每块区域投入资源的数量long[] c…

SpringCloud和SpringCloudAlibaba的区别

1、SpringCloud和SpringCloudAlibaba的区别 SpringCloudAlibaba实际上对我们的SpringCloud2.x和1.x实现拓展组件功能。 nacos是分布式配置中心分布式注册中心Eurekaconfig。 研发SpringCloudAlibaba目的是为了推广阿里的产品&#xff0c;如果使用了SpringCloudAlibaba,最好使…

什么?想让视频号小店领先同行,竟然这么简单!

大家好&#xff0c;我是电商小布。 视频号小店从推出到现在&#xff0c;逐渐也是被越来越多的人所熟知了。 虽然说当前市场内部的商家数量并不多&#xff0c;竞争力不大。 但是在入驻之后想要领先同行商家&#xff0c;产生更好的店铺数据&#xff0c;该怎么来做呢&#xff1…

18.字面量

文章目录 一、字面量二、区分技巧三、扩展&#xff1a; /t 制表符 一、字面量 在有些资料&#xff0c;会把字面量说成常量、字面值常量&#xff0c;这种叫法都不是很正确&#xff0c;最正确的叫法还是叫做&#xff1a;字面量。 作用&#xff1a;告诉程序员&#xff0c;数据在…

【智能算法改进】混沌映射策略--一网打尽

目录 1.引言2.混沌映射3.分布特征4.混沌映射函数调用5.改进智能算法 1.引言 基本种群初始化是在整个空间内随机分布&#xff0c;具有较高的随机性和分布不均匀性&#xff0c;会导致种群多样性缺乏&#xff0c;搜索效率低等问题。 许多学者利用混沌映射机制来增加种群的多样性&…

国内外主要气象卫星介绍

NOAA AVHRR介绍 美国NOAA极轨卫星从1970年12月第一颗发射以来&#xff0c;近40年连续发射了18颗&#xff0c;最新的NOAA-19也将在2009年发射升空。NOAA卫星共经历了5代&#xff0c;目前使用较多的为第五代NOAA卫星&#xff0c;包括NOAA-15—NOAA-18&#xff1b;作为备用的第四…

17.注释和关键字

文章目录 一、 注释二、关键字class关键字 我们之前写的HelloWorld案例写的比较简单&#xff0c;但随着课程渐渐深入&#xff0c;当我们写一些比较难的代码时&#xff0c;在刚开始写完时&#xff0c;你知道这段代码是什么意思&#xff0c;但是等过了几天&#xff0c;再次看这段…

GEC6818开机自动加载驱动与更改开发板的RTC时钟

GEC6818开机自动加载驱动与更改开发板的RTC时钟 本文主要涉及&#xff1a; 1.GEC6818开机自动加载驱动 2.更改开发板的RTC时钟 文章目录 GEC6818开机自动加载驱动与更改开发板的RTC时钟一、开机自动加载驱动或运行程序**STEP1&#xff1a;** 使用vi打开文件profile.命令如下**S…

LinkedIn 互联网架构扩展简史

LinkedIn成立于 2003 年&#xff0c;其目标是连接到您的网络以获得更好的工作机会。第一周只有 2,700 名会员。时间快进了很多年&#xff0c;LinkedIn 的产品组合、会员基础和服务器负载都取得了巨大的增长。 如今&#xff0c;LinkedIn 在全球运营&#xff0c;拥有超过 3.5 亿会…

Portainer的替代Dockge?又一个Docker Compose管理器?

Dockge&#xff1a;让Docker Compose管理触手可及&#xff0c;一图胜千言&#xff0c;轻松构建与管控您的容器服务栈&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 Docker&#xff0c;这一开放源代码的创新平台&#xff0c;旨在实现应用程序部署、扩展与运维的自动化…

术语技巧:如何格式化网页中的术语

术语是语言服务中的核心语言资产。快速处理英汉对照的术语是我们在翻译技术学习过程中需要掌握的必备技能。 通常&#xff0c;我们需要把在权威网站上收集到的术语放到word当中&#xff0c;调整正左右对齐的样式&#xff0c;便于打印学习或者转化为Excel表。 如何快速实现这一…

docker容器下部署hbase并在springboot中通过jdbc连接

我在windows的docker中部署了一个hbase服务&#xff0c;然后用springboot连接到此服务并访问数据。 详情可参考项目中的README.md。项目中提供了用于构建镜像的dockerfile&#xff0c;以及测试代码。 项目连接&#xff1a; https://gitee.com/forgot940629/hbase_phoenix_sprin…

可解释 AI 系统及其构建方式的实用指南——可解释AI实战(PyTorch版)

过去五年中&#xff0c;我们就见证了人工智能(Artifcial Intelligence&#xff0c;AI)领域的重大突破&#xff0c;特别是在图像识别、自然语言理解等领域&#xff0c;以及围棋等棋盘游戏领域。随着人工智能在医疗和金融等行业的广泛应用&#xff0c;它正在辅助人类做出关键的决…

蚂蚁庄园今日答案

蚂蚁庄园是一款爱心公益游戏&#xff0c;用户可以通过喂养小鸡&#xff0c;产生鸡蛋&#xff0c;并通过捐赠鸡蛋参与公益项目。用户每日完成答题就可以领取鸡饲料&#xff0c;使用鸡饲料喂鸡之后&#xff0c;会可以获得鸡蛋&#xff0c;可以通过鸡蛋来进行爱心捐赠。其中&#…

Java中有哪些容器(集合类)?

Java中的集合类主要由Collection和Map这两个接口派生而出&#xff0c;其中Collection接口又派生出三个子接 口&#xff0c;分别是Set、List、Queue。所有的Java集合类&#xff0c;都是Set、List、Queue、Map这四个接口的实现 类&#xff0c;这四个接口将集合分成了四大类&#…

iOS - Runtime-API

文章目录 iOS - Runtime-API1. Runtime应用1.1 字典转模型1.2 替换方法实现1.3 利用关联对象给分类添加属性1.4 利用消息转发机制&#xff0c;解决方法找不到的异常问题 2. Runtime-API2.1 Runtime API01 – 类2.1.1 动态创建一个类&#xff08;参数&#xff1a;父类&#xff0…

Linux 进程信号:产生信号

目录 一、通过终端按键产生信号 1、signal()函数 2、核心转储 3、ulmit命令 二、调用系统函数向进程发信号 1、kill()函数 2、raise()函数 3、abort()函数 三、发送信号的过程 读端关闭、写端继续写入的情况 如何理解软件条件给进程发送信号: 四、软件条件产生信…

【Java - 框架 - Lombok】(1) 普通Java项目通过Lombok+Logback完成日志的创建使用 - 快速上手

普通Java项目通过"Lombok""Logback"完成日志的创建使用 - 快速上手&#xff1b; 步骤A 说明 创建"Maven"项目&#xff1b; 图片 步骤B 说明 添加相关依赖项&#xff1b; 图片 代码 <!-- "Lombok"依赖项--> <dependency>&…

Exception in thread “main“ com.fasterxml.jackson.databind.JsonMappingException:

问题&#xff1a;jaskson反序列化超出最大长度 Caused by: com.fasterxml.jackson.core.exc.StreamConstraintsException: String length (5043456) exceeds the maximum length (5000000) 场景&#xff1a;前端传递过大base64 原因&#xff1a; jaskon默认已经限制了最大长…