题目描述

X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?
已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
例如:

A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -

坦克车只能水平或垂直方向上移动到相邻的区。

输入

输入第一行是一个整数n,表示方阵的大小, 4<=n<100
接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
输入保证A,B都只出现一次。

输出

要求输出一个整数,表示坦克从A区到B区的最少移动步数。
如果没有方案,则输出-1

样例输入 Copy
5
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
样例输出 Copy
10

思路:也就利用bfs,要穿越不同的雷区,-,+,所以也就相当于当前的这个的值不和前面穿过的一个值相同。
  1 #include <iostream>
2 #include <queue>
3 using namespace std;
4 constexpr size_t maxn = 2005;
5 struct node{
6 int x,y;
7 int last;
8 int step;
9 node(int x, int y, int last):x(x), y(y), last(last),step(0){}
10 };
11 bool book[maxn][maxn];
12 int s1, s2, n;
13 int mp[maxn][maxn];
14 int ans;
15 queue<node> q;
16 bool judge(int x, int y)
17 {
18 return x >= 0 && x < n && y >= 0 && y < n;
19 }
20 void bfs(){
21
22 while(q.size()){
23 node p = q.front();
24 q.pop();
25 if(mp[p.x][p.y] == 4){
26 cout << p.step << endl;
27 return;
28 }
29
30 for(int i = -1; i <= 1; ++ i){
31 for(int j = -1; j <= 1; ++ j){
32 if(abs(i) == abs(j))continue;
33 node p2 = p;
34 p2.x = p2.x + i;
35 p2.y = p2.y + j;
36 if(judge(p2.x,p2.y) && !book[p2.x][p2.y] && p2.last != mp[p2.x][p2.y]){
37 p2.last = mp[p2.x][p2.y];
38 p2.step++;
39 book[p2.x][p2.y] = true;
40 q.push(p2);
41 }
42 }
43 }
44
45 }
46 cout << -1 << endl;
47 }
48
49
50
51 int main(){
52
53 char a;
54 cin >> n;
55
56 for(int i = 0; i < n; ++ i){
57 for(int j = 0; j < n; ++ j){
58 cin >> a;
59 if(a == 'A'){
60 mp[i][j] = 3;
61 s1 = i, s2 = j;
62 }
63 if(a == 'B')
64 mp[i][j] = 4;
65 if(a == '-')
66 mp[i][j] = 0;
67 if(a == '+')
68 mp[i][j] = 1;
69 }
70 }
71 q.push({s1,s2,3});
72 book[s1][s2] = true;
73 bfs();
74 }

[蓝桥杯2015决赛]穿越雷区(BFS求最短路)的更多相关文章

  1. [蓝桥杯2015决赛]四阶幻方(DFS + 剪枝)

    题目描述 把1~16的数字填入4x4的方格中,使得行.列以及两个对角线的和都相等,满足这样的特征时称为:四阶幻方. 四阶幻方可能有很多方案.如果固定左上角为1,请计算一共有多少种方案. 比如: 1  ...

  2. 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。

    这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...

  3. POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)

    POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层 ...

  4. UVa 816 (BFS求最短路)

    /*816 - Abbott's Revenge ---代码完全参考刘汝佳算法入门经典 ---strchr() 用来查找某字符在字符串中首次出现的位置,其原型为:char * strchr (cons ...

  5. BFS求最短路

    假设有一个n行m列的迷宫,每个单位要么是空地(用1表示)要么是障碍物(用0表示).如和找到从起点到终点的最短路径?利用BFS搜索,逐步计算出每个节点到起点的最短距离,以及最短路径每个节点的前一个节点. ...

  6. UVA 816 -- Abbott's Revenge(BFS求最短路)

     UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉 ...

  7. 6.4.2 用BFS求最短路

    前面的篇幅占了太多,再次新开一章,讲述BFS求最短路的问题 注意此时DFS就没有BFS好用了,因为DFS更适合求全部解,而BFS适合求最优解 这边再次提醒拓扑变换的思想在图形辨认中的重要作用,需要找寻 ...

  8. 蓝桥杯算法训练 java算法 表达式求值

    问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...

  9. 利用BFS求最短路

    利用BFS求图的最短路, POJ3984 #define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<string.h& ...

随机推荐

  1. 【PAT甲级】1112 Stucked Keyboard (20分)(字符串)

    题意: 输入一个正整数K(1<K<=100),接着输入一行字符串由小写字母,数字和下划线组成.如果一个字符它每次出现必定连续出现K个,它可能是坏键,找到坏键按照它们出现的顺序输出(相同坏键 ...

  2. nginx.conf nginx反向代理配置文件

    nginx反向代理配置文件 nginx.conf proxy_default.conf proxy.conf vhost/*.conf upstream/*.conf cache/*.conf ngi ...

  3. markdown整理

    html标签# h1 ## h2 ### h3 #### h4 ##### h5 ###### h6 一级标题:内容=== 二级标题:内容--- 强调文字:>内容 链接:[文字](链接地址) 图 ...

  4. 粪发涂墙-java1

    相信很多人和笔者一样,经常会做一些数组的初始化工作,也肯定会经常用到集合类.假如我现在要初始化一个String类型的数组,可以很方便的使用如下代码: String [] strs = {"T ...

  5. 【原】移动端vue页面点透事件 - 分析与解决

    近期项目遇到了vue页面事件被带到下一个页面的问题,也就是我们常说的点透事件,主要表现在android机器上,花了不少时间折腾,简单做下总结~ vue页面之间的切换通过Vue Router的route ...

  6. 【转载】 BIOS设置选项详细解释——CPU核心篇

    原文地址: http://kuaibao.qq.com/s/20180226A1G1OC00?refer=spider ---------------------------------------- ...

  7. Servlet_001 我的第一个servlet程序

    今天开启servlet学习 一.第一个Servlet程序 首先写我们的第一个servlet程序 第一步:新建我们的servlet程序(Web Project),命名为Servlet_001 第二步 : ...

  8. 【Go语言系列】第三方框架和库——GIN:快速入门

    要求要安装Gin软件包,需要:1.安装Go(需要1.11+版本)2.设置Go工作区 安装1.下载并安装 gin: $ go get -u github.com/gin-gonic/gin 2.将 gi ...

  9. javascript的正则匹配

    前段时间需要用到比较多的js代码,当时有点搞不清test和match方法的区别,向百度求助,找到了这边关于正则匹配的博文,感谢作者分享. 原文地址[http://blog.sina.com.cn/s/ ...

  10. numpy常用函数之arange函数

    2.np.arange([start, ]stop, [step, ]dtype=None) 作用:   arange函数用于创建等差数组 start:可忽略不写,默认从0开始;起始值 stop:结束 ...