首页 > 其他分享 >最简单的BFS走迷宫问题

最简单的BFS走迷宫问题

时间:2022-12-13 19:00:15浏览次数:44  
标签:bfs int 迷宫 学长 BFS 队列 女孩 简单

原题目链接:https://www.luogu.com.cn/problem/T279759?contestId=88579

 

 

题目背景
人生辗转几十年,今天学长终于遇到了他的喜欢的女孩...

题目描述
在一个阴雨连绵的夜晚,学长在路上走着的时候遇到了他喜欢的女孩,女孩正在路灯下等待雨停,而你恰好拿着伞,并且温柔的学长想要将女孩尽快送回家,现在请你为告诉学长最快回到家要走多远。

输入格式
第一行输入两个整数n,m,表示地图的行数和列数。

下面n行每行m个字符并用空格隔开表示地图,其中0表示可以行走的路,1表示墙壁或积水无法行走。

坐标(1,1)左上角表示学长和女孩当前的位置,坐标(n,m)右下角表示女孩的家,且起点和终点保证为0。

输出格式
输出一行表示学长最短要走多远才能把女孩送到家, 如果无法送到则输出-1

输入输出样例
输入 #1复制
3 3
0 0 0
1 0 0
1 0 0
输出 #1复制
4
输入 #2复制
3 3
0 1 1
1 1 1
1 1 0
输出 #2复制
-1
说明/提示
2<=n,m<=100; 学长认为这是件大事,所以就作为压轴的。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef pair<int,int> PII;
 4 const int N=110;
 5 //bfs:走迷宫问题,只适用与权重都为1的图
 6 int n,m;
 7 int g[N][N];//存储图
 8 int d[N][N];//存储每个位置都走过了没,以及走到这个位置走了几步
 9 PII q[N*N];//队列,一般bfs都是需要队列的
10 
11 int bfs(){
12     int hh=0,tt=0;//hh代表队列头,tt代表队列尾
13     q[0]={0,0};
14     memset(d,-1,sizeof(d));//看这个点曾经走过没有,-1代表没有走
15     d[0][0]=0;//因为从左上角开始走,所以认为左上角是走过的
16     int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};//存储的是向量
17     while(hh<=tt){
18         auto t=q[hh++];//每次取出队头,这里感觉吃力的话那就说明前面的队列没有学的滚瓜烂熟
19         for(int i=0;i<4;i++){//通过向量的方式遍历上下左右四个格子
20             int x=t.first+dx[i];
21             int y=t.second+dy[i];
22             if(x>=0&&x<n&&y>=0&&y<m&&g[x][y]==0&&d[x][y]==-1){//下一格可以走的条件
23                 d[x][y]=d[t.first][t.second]+1;//到达这一格子的步数是上一个格子加1
24                 q[++tt]={x,y};//进队列,通过队列把整个迷宫给遍历一遍,找到最短路径
25             }
26         }
27     }
28     return d[n-1][m-1];//返回到达最后一个格子所需要步数
29 }
30 int main(){
31     cin>>n>>m;//这里n,m都是全局变量
32     for(int i=0;i<n;i++){//输入图
33         for(int j=0;j<m;j++){
34             cin>>g[i][j];
35         }
36     }
37     cout<<bfs()<<endl;
38     return 0;
39 }
40 /*
41   cin:
42   5 5
43   0 1 0 0 0
44   0 1 0 1 0
45   0 0 0 0 0
46   0 1 1 1 0
47   0 0 0 1 0
48   cout:
49   8
50 */

考察内容:最简单的BFS走迷宫问题

标签:bfs,int,迷宫,学长,BFS,队列,女孩,简单
From: https://www.cnblogs.com/llihaotian666/p/16979643.html

相关文章

  • 栈的应用之迷宫问题
    /************************************************************************//*自定义栈*/......
  • 设计模式之美--工厂模式之简单工厂
    核心demo代码:publicclassRuleConfigParserFactory{publicstaticIRuleConfigParsercreateParser(StringconfigFormat){IRuleConfigParserparser=......
  • 如何抠图换背景,分享3秒钟快速抠图的方法教程,简单方便
    PS抠图比较耗费时间,对于新手来说操作起来也比较困难。想要快速抠图换背景,提高效率应该怎么做呢?别着急,网上有很多AI智能抠图的工具可以使用,就算是新手也能轻松操作,3秒快速抠......
  • 防抖节流简单示例
    1//节流在规定时间内只会执行一次,若重复点击,只有一次执行2//防抖在规定时间后执行一次,重复点击,重新开始计时3//----------------------------......
  • python在pycharm写好程序后,简单的部署方法-非生产环境
    这里说的简单,是真正的简单,不是那种长篇大论方法一:打开cmd,或者用pycharm打开终端,安装pyinstaller详见,http://c.biancheng.net/view/2690.html这种方法可以生成独立的exe......
  • WPF TabControl 简单样式自定义
    WPFTabControl 简单样式自定义,覆写控件模版,在此记录下1<!--SimpleStyles:TabControl-->2<StyleTargetType="{x:TypeTabControl}">......
  • JAVA操作PDF实现简单盖章功能(未签字)
    默认再第一页签章:https://www.cnblogs.com/wolf-shuai/p/16977802.html摘要:jar包准备:bcpkix-jdk15on-1.70.jarbcprov-jdk15on-1.70.jariTextAsian.jaritextpdf-5.5.1......
  • springboot 简单设置mysql用户名密码加密
     如何将yml文件中暴露的数据库用户名和密码由明文改为密文,提高安全性。个人觉得是最简单的方式实现yml代码,用户名密码使用文章后面提供的加密算法或者自行寻找方法spr......
  • python单线程+异步协程简单使用
    高性能异步爬虫:异步爬虫的方式:3、单线程+异步协程(推荐)event_loop:事件循环,相当于一个无限循环,可以把一些函数注册到这个事件循环上,当满足某些条件的时候,函数就会被循环执行......
  • 前端项目实战79-postgrest的增删改查简单文档
    Postgrest使用手册1过滤出is_delete=0的数据分页查询并按照id倒叙排列2GEThttp://127.0.0.1:3000/t_wms_location?is_delete=eq......