题目描述

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

#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
int n,flag=;
int vis[][];
char a[][];
int dir[][]={{,},{,-},{,},{-,}};;
struct node
{
int x,y,step;
};
int check(int x,int y)
{
if(x>=&&x<n&&y>=&&y<n)
return ;
else
return ; }
void bfs(int x,int y)
{
node temp;
temp.x=x;
temp.y=y;
temp.step=;
queue<node>p;
p.push(temp);
vis[x][y]=;
while(!p.empty())
{
node now=p.front();
p.pop();
for(int i=;i<;i++)
{
int tx=now.x+dir[i][];
int ty=now.y+dir[i][];
if(check(tx,ty)&&vis[tx][ty]==&&a[tx][ty]!=a[now.x][now.y])
{
if(a[tx][ty]=='B')
{
cout<<now.step+<<endl;
flag=;
return ;
}
vis[tx][ty]=;
node temp;
temp.x=tx;
temp.y=ty;
temp.step=now.step+;
p.push(temp);
}
}
}
}
int main()
{
cin>>n;
int s,e;
memset(vis,,sizeof(vis));
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
cin>>a[i][j];
if(a[i][j]=='A')
{
s=i;
e=j;
}
}
}
bfs(s,e);
if(flag==)
cout<<-<<endl;
return ;
}
// 5
// A + - + -
// - + - - +
// - + + + -
// + - + - +
// B + - + -

题解二:DFS

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int n,flag=,mn=;
int vis[][],dir[][]={{,},{,},{-,},{,-}};
char a[][];
int check(int x,int y)
{
if(x>=&&x<n&&y>=&&y<n)
return ;
else
{
return ;
} }
void dfs(int x,int y,int cnt)
{
if(mn<=cnt)//优化避免超时
return ;
if(a[x][y]=='B')
{
flag=;
mn=min(mn,cnt);
return ;
}
else
{
for(int i=;i<;i++)
{
int tx=x+dir[i][];
int ty=y+dir[i][];
if(check(tx,ty)&&vis[tx][ty]==&&a[x][y]!=a[tx][ty])
{
vis[tx][ty]=;
dfs(tx,ty,cnt+);
vis[tx][ty]=;
}
}
}
}
int main()
{
cin>>n;
int x,y;
memset(vis,,sizeof(vis));
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
cin>>a[i][j];
if(a[i][j]=='A')
{
x=i;
y=j;
}
}
}
vis[x][y]=;
dfs(x,y,);
if(flag==)
cout<<-<<endl;
else
cout<<mn<<endl;
//system("pause");
return ;
}

穿越雷区--蓝桥杯--DFS/BFS的更多相关文章

  1. 方格填数--蓝桥杯---dfs

    答案:1580 相似题目:N皇后问题 注意要枚举的是什么 #include<iostream> #include<string.h> using namespace std; ...

  2. 蓝桥杯dfs搜索专题

    2018激光样式 #include<bits/stdc++.h> using namespace std; /* dfs(i) 第i个激光机器 有两种选择:vis[i-1] == 0 时 ...

  3. 寒假作业---蓝桥杯---DFS

    题目描述 现在小学的数学题目也不是那么好玩的. 看看这个寒假作业: 每个方块代表1~13中的某一个数字,但不能重复. 比如: 6  + 7 = 13 9  - 8 = 1 3  * 4 = 12 10 ...

  4. 四阶幻方-蓝桥杯-DFS

    答案:416 用next_permutation()全部排列的话会超时 所以用dfs搜索,只搜索前三行就好,前三行确定之后,第四行也就确定 #include<iostream> #incl ...

  5. 蓝桥杯---剪格子(DFS&BFS)(小总结)

    问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+ ...

  6. java实现第六届蓝桥杯穿越雷区

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

  7. 蓝桥杯---数独(模拟 || dfs)

    [编程题](满分33分) "数独"是当下炙手可热的智力游戏.一般认为它的起源是"拉丁方块",是大数 学家欧拉于1783年发明的. 如图[1.jpg]所示:6x6 ...

  8. 蓝桥杯之大臣的旅费(两次dfs)

    Description 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个 ...

  9. 蓝桥杯之剪格子(经典dfs)

    如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+--+-- ...

随机推荐

  1. JS中的字符串可以直接调用字符串对象的属性和方法

    在JS中,会自动在字符串与字符串对象之间进行转换,因此,任何一个字符串常量都可以看作是一个String对象,其可以直接作为对象使用,只要在字符串变量的后面加 “.” 便可以直接调用String对象的属 ...

  2. 各种颜色空间之间的转换算法(XYZ → Standard-RGB ,Standard-RGB → XYZ)

    http://www.easyrgb.com/en/convert.php#Result http://www.easyrgb.com/en/math.php

  3. 爬虫 - Scrapy中间件

    前提:看Scrapy架构图 不管什么Middlewares,都写在middlewares.py里面. 然后在settings.py里的DOWNLOADER_MIDDLEWARES或者SPIDER_MI ...

  4. javascript中offsetWidth、clientWidth、width、scrollWidth、clientX、screenX、offsetX、pageX

    原文:https://www.cnblogs.com/ifworld/p/7605954.html 元素宽高 offsetWidth //返回元素的宽度(包括元素宽度.内边距和边框,不包括外边距) o ...

  5. zookeeper的安装(单机版)

    一.获取zookeeper的安装包 zookeeper的官网下载:wget  https://archive.apache.org/dist/zookeeper/zookeeper-3.4.10/zo ...

  6. ios 底部用定位 fixed。在软件盘出来后,页面元素被顶上去一部分,fixed定位的footer也跑到了上面去。解决方法

    ios 底部用定位 fixed.在软件盘出来后,页面元素被顶上去一部分,fixed定位的footer也跑到了上面去.解决方法 $("input").focus(function() ...

  7. Tensorflow机器学习入门——读取数据

    TensorFlow 中可以通过三种方式读取数据: 一.通过feed_dict传递数据: input1 = tf.placeholder(tf.float32) input2 = tf.placeho ...

  8. 世界协调时间(UTC)与中国标准时间

    整个地球分为二十四时区,每个时区都有自己的本地时间.在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated).UTC与格 ...

  9. CCF认证 2019-12-3

    分析 后面的数据,坐标分布太离散,不能用一个二位数组来模拟垃圾分布.因此,考虑用一个数组记录每个垃圾点的位置. 先根据x坐标.再根据y坐标进行排序. 再遍历数组中的每一处垃圾点,判断其是否能建回收站( ...

  10. POJ-1087 A Plug for UNIX (网络流)

    思路 电器数1 ~ 100,附带100种接口,注意题目:You notice that some of the devices use plugs for which there is no rece ...