本题为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相关推荐

  1. 蓝桥杯历届-穿越雷区

    蓝桥杯历届-穿越雷区 标题:穿越雷区 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量 ...

  2. 蓝桥杯_穿越雷区 java

    题目描述 X 星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从 A 区到 B 区去( A,B 区本身是安全区,没有正能量或负能量特征),怎样走 ...

  3. 标题 穿越雷区 java_【蓝桥杯】穿越雷区-java语言描述

    标题:穿越雷区X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最 ...

  4. 蓝桥杯:穿越雷区——DFS

    标题:穿越雷区 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径 ...

  5. 蓝桥杯 15决赛 B4 穿越雷区(bfs)

    蓝桥杯 15决赛 B4 穿越雷区(bfs) 标题:穿越雷区 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全 ...

  6. 蓝桥杯 python 走迷宫 BFS

    蓝桥杯 python 走迷宫 BFS 题目描述 给定一个 N × × × M 的网格迷宫 G.GG的每个格子要么是道路,要么是障碍物(道路用 1 表示,障碍物用 0 表示). 已知迷宫的入口位置为 ( ...

  7. 标题 穿越雷区 java_蓝桥杯javaB--穿越雷区

    标题:穿越雷区 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径 ...

  8. [蓝桥杯2015决赛]穿越雷区-bfs

    题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短? ...

  9. 蓝桥杯 穿越雷区(bfs)

    题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短? ...

最新文章

  1. python记录当前系统时间 生成照片直接命名
  2. 热议 | 两位14岁清华最小本科生 「天才少年」直入清华丘成桐数学领军计划
  3. php数据采集类,一个数据采集类
  4. LeetCode周赛191
  5. Java黑皮书课后题第8章:*8.23(游戏:找到翻转的单元格)假定给定一个填满0和1的6*6矩阵,所有的行和列都有偶数个1。让用户翻转一个单元,编写一个程序找到哪个单元格被翻转了
  6. apt-mirror 校验错误文件处理
  7. jsf集成spring_JSF – PrimeFaces和Hibernate集成项目
  8. 介绍几款Web TimeSheet相关的软件
  9. snowflake算法
  10. mapinfo在线地图插件_利用开源软件下载地图和影像瓦片数据(修订版)
  11. html a4页面样式_4个使用将HTML转换为PDF的方法介绍-js教程
  12. 通往诺贝尔奖之路:盘点10个著名的科学家族
  13. 关于考研复习数学分析和高等代数
  14. echarts 画中国地图
  15. maven lastUpdated 文件清理脚本
  16. 简谱打谱软件音乐梦想家与作曲大师有什么不同
  17. Java 逆波兰表达式完成计算器
  18. 【可视化】娱乐一下,rviz上画个3D框
  19. 独家食用指南系列|Android端SQLite的浅尝辄止
  20. python autocad显示_python 使用pyautocad操作AutoCAD

热门文章

  1. 反激式开关电源-手机充电器5V/1A
  2. 中国石油大学《政治学原理》第一次在线作业
  3. 记录一次电脑数据删除分区后的恢复
  4. prism 视图发现
  5. 激光雷达鼻祖Velodyne谋求合并求生:高层动荡 亏损不止
  6. python量化投资实战-股票实盘分析
  7. MySQL 技术内幕——存储引擎
  8. CoreMark简介
  9. caffe刚开始训练准确率很高,经过几次训练就达到饱和的原因
  10. 光流.flo文件处理