穿越雷区


一、题目内容

题目描述

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

二、思路分析

一般情况下,当看到这样的二维数组的地图最终去某个地方求最短路径的问题,都可以用深度优先搜索(DFS)或者广度优先搜索(BFS)来解决,不过地图大的情况下,DFS有可能超时,还是要看具体情况。通常的话,地图小用DFS,BFS都可以,地图大建议用BFS。

BFS思路:

记录起点坐标,以起点为head,遍历上下左右四个方向的地点,符合条件的地点则存储,然后tail++,不符合就不存储进来,向下一个方向遍历,直至4个方向都尝试过了。遍历4个方向后,head++,以新的head为起点,再次遍历四个方向.......如此反复搜索的一个过程。


三、代码实现

#include <bits/stdc++.h>//万能头文件
using namespace std;char Map[101][101]; //地图数组
bool Vis[101][101]; //标记数组 标记是否走过
int Next[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; //方向数组 遍历方向typedef struct node { //定义结构体数组,便于操作调用 包含坐标,步数,符号int x, y, step;char flag;
} node;
node n[10001]; //BFS数组一般是m*m,再开大一点int main() {int m;cin >> m;getchar(); //吃掉回车int head, tail, x, y, tx, ty;for (int i = 1; i <= m; i++) {for (int j = 1; j <= m; j++) {scanf("%c", &Map[i][j]);if (Map[i][j] == 'A') { //记下起点位置的坐标x = i, y = j;}getchar(); //吃掉空格和回车}}head = tail = 1; //初始化 BFS可以理解为一个队列,头和尾n[head].x = x;n[head].y = y;n[head].step = 0;n[head].flag = ' ';Vis[x][y] = 1; //标记起点位置为走过了tail++;while (head < tail) { //BFS核心for (int i = 0; i < 4; i++) { //遍历4个方向tx = n[head].x + Next[i][0];ty = n[head].y + Next[i][1];if (tx > m || ty > m || tx < 1 || ty < 1) //出边界continue;if (Vis[tx][ty] == 0 && n[head].flag != Map[tx][ty]) { //没走过且符合+-Vis[tx][ty] = 1;n[tail].flag = Map[tx][ty];n[tail].x = tx;n[tail].y = ty;n[tail].step = n[head].step + 1;tail++;}}if (n[head].flag == 'B') { //走到终点cout << n[head].step << endl;return 0;}head++;}cout << "-1"; //走不到终点return 0;
}

加油哦! 如有错误和需要改进完善之处,欢迎大家纠正指教。

蓝桥杯2015年第六届真题——穿越雷区(C/C++)相关推荐

  1. 问题 1825: [蓝桥杯][2015年第六届真题]穿越雷区

    问题 1825: [蓝桥杯][2015年第六届真题]穿越雷区 时间限制: 1Sec 内存限制: 128MB 提交: 310 解决: 211 题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区 ...

  2. [蓝桥杯][2015年第六届真题]穿越雷区

    文章目录 题目描述 输入 输出 样例输入 样例输出 c语言AC代码 题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去( ...

  3. 蓝桥杯2015年第六届真题-穿越雷区

    题目 题目链接 题解 BFS模板题. 就在模板题的基础上稍微加了点限制而已. 我用的是pair存的,first表示位置,将二维压缩成一维了:second表示步数: 要求正负交替,我就采用异或的思想进行 ...

  4. [蓝桥杯][2015年第六届真题]生命之树(树形dp)

    题目描述 在X森林里,上帝创建了生命之树. 他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值. 上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都 ...

  5. [蓝桥杯][2015年第六届真题]密文搜索(排序+二分)

    题目描述 福尔摩斯从X星收到一份资料,全部是小写字母组成. 他的助手提供了另一份资料:许多长度为8的密码列表. 福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的. 请你编写一个程序,从第一份资料 ...

  6. [蓝桥杯][2015年第六届真题]机器人塔(DFS)

    题目描述 X星球的机器人表演拉拉队有两种服装,A和B. 他们这次表演的是搭机器人塔. 类似: A B B A B A A A B B B B B A B A B A B B A 队内的组塔规则是: A ...

  7. [蓝桥杯][2015年第六届真题]表格计算(递归+记忆化)

    题目描述 某次无聊中, atm 发现了一个很老的程序.这个程序的功能类似于 Excel ,它对一个表格进行操作. 不妨设表格有 n 行,每行有 m 个格子. 每个格子的内容可以是一个正整数,也可以是一 ...

  8. 蓝桥杯2015年第六届C/C++ B组省赛习题题解

    目录 第一题:奖券数目 第二题:星系炸弹(日期计算) 第三题:三羊献瑞(全排列) 第四题:格子中输出 第五题:九数组分数(dfs) 第六题:加法变乘法(枚举) 第七题:牌型种数(dfs+dp) 第八题 ...

  9. [蓝桥杯][2019年第十届真题]扫地机器人(二分+贪心)

    题目描述 小明公司的办公区有一条长长的走廊,由 N 个方格区域组成,如下图所 示. 走廊内部署了 K 台扫地机器人,其中第 i 台在第 Ai 个方格区域中. 已知扫地机器人每分钟可以移动到左右相邻的方 ...

最新文章

  1. Android SQLite数据库之事务的学习
  2. php数据库数组去重复数据库,PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)...
  3. Android_自定义水波纹菜单弹出效果
  4. java IO流、集合类部分小知识点总结
  5. 理解Python中的装饰器
  6. 剑指 只出现一次的数字
  7. 【Java对象转换】002- Java 对象与 Map 互转
  8. 华师在线计算机网络,华师在线-作业计算机网络.docx
  9. 我在故宫修文物大电影B站爬虫
  10. python怎么撤销_用Python玩转微信(三)—— 查看撤回消息
  11. matlab中Svmtrain和Svmpredict的用法
  12. 刘韧工作手册(2023年版)
  13. IM即时通讯工具可以这样个性定制
  14. continu和break的区别
  15. header-icon stm32实现圆弧插补,c语言代码实现
  16. 【OpenCV】Ubuntu配置OpenCV环境
  17. E440 固态硬盘装Win7
  18. 代码随想录训练营day29
  19. 企业联合体的形式_企业战略联盟的形式有哪些
  20. SQL 语句的用法用途

热门文章

  1. Linux部分实用指令
  2. 【项目】新冠肺炎疫情期间网民情绪识别——Python文本分类
  3. Easyx基本使用(一)
  4. SQL的使用规范以及基本使用
  5. android5.1物联网卡打开,物联网卡这样设置一下上网全程4G!建议收藏!
  6. rHAT,国内首个三代序列比对算法
  7. python 特效字_Python的文字特效,炫酷了!
  8. 有点无聊,来用Python制作代码雨
  9. mysql 0xc0000005_应用程序无法正常启动0xc0000005怎么办
  10. 用scratch编程画心形线