蓝桥杯之穿越雷区 BFS
本题为2015年第六届蓝桥杯C语言A组试题,第4题。
考点:广度优先搜索(BFS)
广搜一般用来解决“最短”“最少”问题,需用到队列。
题目描述
标题:穿越雷区
X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?
已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
例如:
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
坦克车只能水平或垂直方向上移动到相邻的区。
数据格式要求:
输入第一行是一个整数n,表示方阵的大小, 4<=n<100
接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
A,B都只出现一次。
要求输出一个整数,表示坦克从A区到B区的最少移动步数。
如果没有方案,则输出-1
例如:
用户输入:
5
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
则程序应该输出:
10
资源约定:
峰值内存消耗 < 512M
CPU消耗 < 1000ms
解题思路
用二维数组map[ ][ ]接收“地图”,注意输入时有空格隔开,需要过滤掉空格。
之后找到入口,即“A”所在位置,从该点开始广度优先搜索。
本题解不打算解释为什么BFS能解决此问题,如果想知道,请移步BFS的相关学习文档。本题作为一个典型的BFS题,该题解意在为此类问题提供一个模板。
详细解释看代码:
#include<iostream>
#include<cstring>
#include<queue>//我们使用STL中的队列容器
using namespace std;
char map[101][101];
int n;
//以下两个数组为坦克走的四个方向
int bx[4]={-1,1,0,0};
int by[4]={0,0,-1,1};
//定义结构体,方便广搜时入队、出队
struct poi{int x;//记录该点横坐标int y;//记录该点纵坐标int step;//记录从起始点走到该点的步数
};
void bfs(int x,int y){int vis[101][101]={0};//标记某点是否访问过queue<poi>path;//定义队列pathint row,col,step_n;//三个中间变量,对应结构体的三个变量poi p1;//起始点'A'p1.x=x;//起始点横坐标p1.y=y;//起始点纵坐标p1.step=0;//‘A’点的步数肯定是0path.push(p1);//'A'点入列vis[x][y]=1;//标记'A'点已访问while(!path.empty()){//循环遍历,相当于以A为圆心,一圈一圈向四周扩展访问//以下三行用来访问当前队首元素,依次获取坐标和步数row=path.front().x;col=path.front().y;step_n=path.front().step;//获取之后,元素出队path.pop();for(int i=0;i<4;i++){//向四个方向探索能否走下去if(row+bx[i]>=n||row+bx[i]<0||col+by[i]>=n||col+by[i]<0)//如果到达边界continue;if(vis[row+bx[i]][col+by[i]]==0){//要求该点必须未访问过才能进行下列操作if(map[row][col]!=map[row+bx[i]][col+by[i]]){//当前该点和接下要走到的点不能相等//满足以上条件,就可以放心大胆的"走"了//定义p2,通过p1给它赋值,然后入队,就相当于“走”到了下一点了poi p2;p2.x=row+bx[i];p2.y=col+by[i];p2.step=step_n+1;path.push(p2);vis[p2.x][p2.y]=1;if(map[p2.x][p2.y]=='B'){//判断是否走完cout<<p2.step<<endl;//走到终点的步数一定是最短的return;}}}}//如果四个方向都走不通,则说明无路可走,输出-1,直接返回cout<<-1<<endl;return;}
}
int main(){cin>>n;int i,j;char a;for(i=0;i<n;i++){//接收“地图”for(j=0;j<n;j++){cin>>a;if(a==' '){//注意要忽略空格--j;continue;}else{map[i][j]=a;}}}for(i=0;i<n;i++){//用于找到入口'A',因为A不一定在map[0][0]位置for(j=0;j<n;j++){if(map[i][j]=='A'){bfs(i,j);break;}}break;}return 0;
}
蓝桥杯之穿越雷区 BFS相关推荐
- 蓝桥杯历届-穿越雷区
蓝桥杯历届-穿越雷区 标题:穿越雷区 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量 ...
- 蓝桥杯_穿越雷区 java
题目描述 X 星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从 A 区到 B 区去( A,B 区本身是安全区,没有正能量或负能量特征),怎样走 ...
- 标题 穿越雷区 java_【蓝桥杯】穿越雷区-java语言描述
标题:穿越雷区X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最 ...
- 蓝桥杯:穿越雷区——DFS
标题:穿越雷区 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径 ...
- 蓝桥杯 15决赛 B4 穿越雷区(bfs)
蓝桥杯 15决赛 B4 穿越雷区(bfs) 标题:穿越雷区 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全 ...
- 蓝桥杯 python 走迷宫 BFS
蓝桥杯 python 走迷宫 BFS 题目描述 给定一个 N × × × M 的网格迷宫 G.GG的每个格子要么是道路,要么是障碍物(道路用 1 表示,障碍物用 0 表示). 已知迷宫的入口位置为 ( ...
- 标题 穿越雷区 java_蓝桥杯javaB--穿越雷区
标题:穿越雷区 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径 ...
- [蓝桥杯2015决赛]穿越雷区-bfs
题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短? ...
- 蓝桥杯 穿越雷区(bfs)
题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短? ...
最新文章
- python记录当前系统时间 生成照片直接命名
- 热议 | 两位14岁清华最小本科生 「天才少年」直入清华丘成桐数学领军计划
- php数据采集类,一个数据采集类
- LeetCode周赛191
- Java黑皮书课后题第8章:*8.23(游戏:找到翻转的单元格)假定给定一个填满0和1的6*6矩阵,所有的行和列都有偶数个1。让用户翻转一个单元,编写一个程序找到哪个单元格被翻转了
- apt-mirror 校验错误文件处理
- jsf集成spring_JSF – PrimeFaces和Hibernate集成项目
- 介绍几款Web TimeSheet相关的软件
- snowflake算法
- mapinfo在线地图插件_利用开源软件下载地图和影像瓦片数据(修订版)
- html a4页面样式_4个使用将HTML转换为PDF的方法介绍-js教程
- 通往诺贝尔奖之路:盘点10个著名的科学家族
- 关于考研复习数学分析和高等代数
- echarts 画中国地图
- maven lastUpdated 文件清理脚本
- 简谱打谱软件音乐梦想家与作曲大师有什么不同
- Java 逆波兰表达式完成计算器
- 【可视化】娱乐一下,rviz上画个3D框
- 独家食用指南系列|Android端SQLite的浅尝辄止
- python autocad显示_python 使用pyautocad操作AutoCAD