题目传送门

G逃脱 

题目描述

这是mengxiang000和Tabris来到幼儿园的第四天,幼儿园老师在值班的时候突然发现幼儿园某处发生火灾,而且火势蔓延极快,老师在第一时间就发出了警报,位于幼儿园某处的mengxiang000和Tabris听到了火灾警报声的同时拔腿就跑,不知道两人是否能够逃脱险境?

幼儿园可以看成是一个N*M的图,在图中一共包含以下几种元素:

“.”:表示这是一块空地,是可以随意穿梭的。

“#”:表示这是一块墙,是不可以走到这上边来的,但是可以被火烧毁。

“S”:表示mengxiang000和Tabris所在位子。

“E”:表示幼儿园的出口。

“*”表示火灾发源地(保证输入只有一个火灾发源地)。

已知每秒有火的地方都会向周围八个格子(上下左右、左上、右上、左下、右下)蔓延火势.mengxiang000和Tabris每秒都可以选择周围四个格子(上下左右)进行移动。(假设两人这一秒行动完之后,火势才蔓延开)

根据已知条件,判断两人能否成功逃脱险境,如果可以,输出最短逃离时间,否则输出T_T。
 为了防止孩子们嬉戏中受伤,墙体是橡胶制作的,可以燃烧的哦。

输入描述:

第一行输入一个整数t,表示一共的测试数据组数。
第二行输入两个整数n,m,表示幼儿园的大小。
接下来n行,每行m个字符,表示此格子是什么元素。
t<=200
3<=n<=30
3<=M<=30
保证图中有一个起点,一个出口,一个火灾源处

输出描述:

每组数据输出一行,如果两人能够成功到达出口,那么输出最短逃离时间,否则输出T_T
输入:

3
5 5
*....
.....
..S#.
...E.
.....
5 5
...#*
..#S#
...##
....E
.....
5 5
.....
S....
..*#.
...E.
.....

输出:

2
T_T
T_T

题意:就是两个人再S这个点,然后火灾*这里会向八个方向蔓延,求逃离最短时间,否则输出T_T;

题解:简单bfs,但是要注意WA点:如果到达了E,火再蔓延过来没事;如果到达了‘.’,火蔓延过来还是会死。

因为这个WA了好几发

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAX 35
#define INF 0x3f3f3f3f
int n,m;
int T;
char g[MAX][MAX];
bool vis[MAX][MAX];
int fire[MAX][MAX];
int ans=INF;
int dx[]={,,,-},dy[]={,,-,};
int sx,sy;
int fx,fy;
struct mask
{
int x,y,step;
mask(){}
mask(int x,int y,int step):x(x),y(y),step(step){};
};
queue<mask>q;
bool check(int a,int b){return <=a&&a<n&&<=b&&b<m;}
void fire_path()
{
memset(vis,false,sizeof(vis));
memset(fire,,sizeof(fire));
while(q.size()) q.pop();
q.push(mask(fx,fy,));
vis[fx][fy]=true;
fire[fx][fy]=;
while(q.size())
{
mask tmp=q.front();q.pop();
for(int i=-;i<=;i++)
for(int j=-;j<=;j++)
{
int nx=tmp.x+i;
int ny=tmp.y+j;
if(check(nx,ny)&&!vis[nx][ny])
{
vis[nx][ny]=true;
fire[nx][ny]=tmp.step+;
q.push(mask(nx,ny,tmp.step+));
}
}
}
}
void bfs()
{
memset(vis,false,sizeof(vis));
while(q.size()) q.pop();
vis[sx][sy]=true;
q.push(mask(sx,sy,));
while(q.size())
{
mask tmp=q.front();q.pop();
if(g[tmp.x][tmp.y]=='E')
{
ans=min(ans,tmp.step);
return ;
}
for(int i=;i<;i++)
{
int nx=dx[i]+tmp.x;
int ny=dy[i]+tmp.y;
//注意这里要讨论一下
if(g[nx][ny]=='E'&&tmp.step+<=fire[nx][ny])
{
vis[nx][ny]=true;
q.push(mask(nx,ny,tmp.step+));
}
if(check(nx,ny)&&!vis[nx][ny]&&g[nx][ny]!='#'&&tmp.step+<fire[nx][ny])
{
vis[nx][ny]=true;
q.push(mask(nx,ny,tmp.step+));
}
}
}
}
int main()
{
cin>>T;
while(T--){
cin>>n>>m;
for(int i=;i<n;i++)
{
cin>>g[i];
for(int j=;j<m;j++)
{
if(g[i][j]=='S')
{
sx=i;
sy=j;
}
if(g[i][j]=='*')
{
fx=i;
fy=j;//cout<<i<<j<<endl;
}
}
}
ans=INF;
fire_path();
/*for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cout<<fire[i][j];
cout<<endl;
}*/
bfs();
if(ans==INF)
cout<<"T_T"<<endl;
else cout<<ans<<endl;
}
}


逃脱 (简单BFS)的更多相关文章

  1. LightOJ 1012 简单bfs,水

    1.LightOJ 1012  Guilty Prince  简单bfs 2.总结:水 题意:迷宫,求有多少位置可去 #include<iostream> #include<cstr ...

  2. POJ3185(简单BFS,主要做测试使用)

    没事做水了一道POJ的简单BFS的题目 这道题的数据范围是20,所以状态总数就是(1<<20) 第一次提交使用STL的queue,并且是在队首判断是否达到终点,达到终点就退出,超时:(其实 ...

  3. 【POJ 3669 Meteor Shower】简单BFS

    流星雨撞击地球(平面直角坐标第一象限),问到达安全地带的最少时间. 对于每颗流星雨i,在ti时刻撞击(xi,yi)点,同时导致(xi,yi)和上下左右相邻的点在ti以后的时刻(包括t)不能再经过(被封 ...

  4. hdu1312 Red and Black 简单BFS

    简单BFS模版题 不多说了..... 直接晒代码哦.... #include<cstdlib> #include<iostream> #include<cstdio> ...

  5. poj2251 三维简单BFS

    D - (热身)简单宽搜回顾 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Subm ...

  6. hdu2717Catch That Cow 简单BFS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2717 刚开始思路错了,用的DP,一直WA,后来才发现是搜索,还是简单的BFS,顿时.... 思路: B ...

  7. luogu 2296 寻找道路 简单BFS

    简单的BFS,练习基础 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) #defi ...

  8. poj 3414(简单bfs)

    题目链接:http://poj.org/problem?id=3414 思路:bfs简单应用,增对瓶A或者瓶B进行分析就可以了,一共6种状态. #include<iostream> #in ...

  9. hrbust1444 逃脱 【BFS】

    Description  这是mengxiang000和Tabris来到幼儿园的第四天,幼儿园老师在值班的时候突然发现幼儿园某处发生火灾,而且火势蔓延极快,老师在第一时间就发出了警报,位于幼儿园某处的 ...

随机推荐

  1. 09-python的面向对象

    # 1. 面向对象概述(ObjectOriented,OO) - OOP思想 - 接触到任意一个任务,首先想到的是任务这个世界的构成,是由模型构成的 - 几个名词 - OO:面向对象 - OOA:面向 ...

  2. 使用js实现图片轮滑效果

    经常在购物网站,看到那种图片轮滑的效果,所以看到有人实现了,所以我也就学习下了. 首先贴出html代码: <!DOCTYPE html> <html lang="en&qu ...

  3. jquery遍历获取带checkbox表格的选中值以及遍历json数组

    今天整理了一下jquery遍历的两个用法,分享给大家. 1.$().each 主要用来遍历DOM元素,获取DOM的值或样式等. 2.$.each() 主要用来遍历后台ajax返回的json数组,循环将 ...

  4. unity ui坐标系转换

    世界坐标: transform.position获取的是世界坐标 屏幕坐标: 单位像素 屏幕左下角(0,0)右上角(Screen.width,Screen.height) Screen.width = ...

  5. shell脚本实现ftp上传下载文件

    前段时间工作中需要将经过我司平台某些信息核验数据提取后上传到客户的FTP服务器上,以便于他们进行相关的信息比对核验.由于包含这些信息的主机只有4台,采取的策略是将生成的4个文件汇集到一个主机上,然后在 ...

  6. openssl版本升级

    1.查看openssl版本 [root@node2 openssh-8.0p1]# openssl version OpenSSL 1.0.1e-fips 11 Feb 2013 2.下载指定版本的o ...

  7. 一、Angular环境的搭建

    1.安装nodejs (1) 下载网址https://nodejs.org/en/download/ (2) 双击进行安装 (3) 打开命令行,输入node -v 和 npm -v 查看是否安装成功 ...

  8. ltp-ddt smp_basic

    SMP_S_FUNC_DUAL_CORE source functions.sh; cmd="stress-ng --matrix 4 -t 10s --perf --matrix-size ...

  9. List接口和Set接口及其常用实现类概述

    一.List接口 List:有序的 collection(也称为序列).此接口的用户可以对列表中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元 ...

  10. 一个简单的JSP 连接MySQL使用实例

    一.软件环境 下载并安装MySQL,Tomacat,JDBC.MyEclipse或其他IDE. 二.环境配置 将其环境变量配置好之后,下载Java 专用的连接MySQL的驱动包JDBC,有人会发现在一 ...