FZU2285 迷宫问题 BFS求最短路-板子题
时间:2022-07-24
本文章向大家介绍FZU2285 迷宫问题 BFS求最短路-板子题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Problem Description 洪尼玛今天准备去寻宝,在一个n*n (n行, n列)的迷宫中,存在着一个入口、一些墙壁以及一个宝藏。由于迷宫是四连通的,即在迷宫中的一个位置,只能走到与它直接相邻的其他四个位置(上、下、左、右)。现洪尼玛在迷宫的入口处,问他最少需要走几步才能拿到宝藏?若永远无法拿到宝藏,则输出-1。
Input 多组测试数据。
每组数据输入第一行为正整数n,表示迷宫大小。
接下来n行,每行包括n个字符,其中字符’.‘表示该位置为空地,字符’#'表示该位置为墙壁,字符’S’表示该位置为入口,字符’E’表示该位置为宝藏,输入数据中只有这四种字符,并且’S’和’E’仅出现一次。
Output 输出拿到宝藏最少需要走的步数,若永远无法拿到宝藏,则输出-1。
Sample Input
5 S.#… #.#.# #.#.# #…E #…
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAX = 1000;
char maza[MAX][MAX];//记录迷宫
int step[MAX][MAX];//记录步数
int sx,sy,ex,ey;//记录起点和终点
struct Point
{
int x;
int y;
} point1,point2;//记录当前位置和下一位置
int dir[4][2]= {{0,1},{0,-1},{-1,0},{1,0}};//上下左右四个方向
queue<Point> Q;//队列
int main()
{
int n,flag;
while(cin>>n)
{
flag=0;
while(!Q.empty())
Q.pop();//清空队列
memset(step,0,sizeof(step));//把记录步数的数组设为0
for(int i=0;i<n;++i)
scanf("%s",maza[i]);
for(int i=0; i<n; ++i)
for(int j=0; j<n; ++j)
{
if(maza[i][j]=='S')
sx=i,sy=j;
if(maza[i][j]=='E')
ex=i,ey=j;//遍历图形找到起点和终点
}
step[sx][sy]=1;//设起点为1表示已经被访问过
point1.x=sx;
point1.y=sy;
Q.push(point1);//把起点添加到队列
while(!Q.empty())//当队列不为空时进行循环查找队列
{
point1=Q.front();//拿出队列首元素
Q.pop();//拿出后移除首元素
for(int i=0; i<4; ++i)
{
point2.x=point1.x+dir[i][0];
point2.y=point1.y+dir[i][1];
if( point2.x >= 0 && point2.y >= 0 && point2.x < n && point2.y < n && !step[point2.x][point2.y] && maza[point2.x][point2.y] != '#' )
{
//如果下一个节点不出边界,没被访问过且不是墙,则步数+1
step[point2.x][point2.y]=step[point1.x][point1.y]+1;
Q.push(point2);
}
}
if(step[ex][ey]!=0)
{//找到出口
flag=1;
break;
}
}
if(flag)
cout<<step[ex][ey]-1<<endl;//因为起点为1,故需减去1则为步数
else
cout<<-1<<endl;
}
return 0;
}
- Drawable.Bitmap.Canvas.Paint.Matrix
- 关于JSON.stringify和Unicode编码,需要注意的几点
- 用 PHP 的方式实现的各类算法合集
- Nginx 反向代理解决前后端联调跨域问题
- JavaScript对象length
- Go1.8.4和Go1.9.1版本发布
- Javascript数组操作
- Tensorflow官方语音识别入门教程 | 附Google新语音指令数据集
- jQuery VS JavaScript原生API
- 居于H5的多文件、大文件、多线程上传解决方案
- 抛弃websocket,前端直接打通信道,webRTC搭建音视频聊天
- Golang学习-第三篇 认识Web框架
- Golang学习-第二篇 搭建一个简单的Go Web服务器
- 数据说话:Go语言的Switch和Map性能实测
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 用Python的Numpy求解线性方程组
- python用于NLP的seq2seq模型实例:用Keras实现神经机器翻译
- 使用Python和Keras进行主成分分析、神经网络构建图像重建
- python使用Flask,Redis和Celery的异步任务
- 在R语言中进行缺失值填充:估算缺失值
- Docsify 如何添加目录列表
- Dubbo日志链路追踪TraceId选型
- 重温C++的设计思想
- 设计一个网站(域名)的镜像
- LoRa终端设备ASR6505普通GPIO操作
- LoRa终端设备ASR6505之I2C通信
- 我在暴躁同事小张的胁迫下学会了Go的交叉编译和条件编译
- LoRa终端设备ASR6505之PingPong通信
- LoRa点对点通信,OLED显示(内附代码)
- 08 . Python3高阶函数之迭代器、装饰器