题目传送门

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. 【学习总结】gcc和gdb

    目录 <> vim.gcc.gdb: gcc: gcc和g++是c/c++的linux系统集成的编译器,源文件的后缀应为 .C/.cpp/.c++/.cc等 编译器可以将C.C++等语言源 ...

  2. ES6——数组

    数组: map       映射  ———— 一个对一个 reduce   汇总  ———— 一堆出来一个 算个总数 [1,2,3]==>6 算平均数 [1,2,3]==>2 filter ...

  3. elasticsearch 基础 —— 处理冲突及乐观并发控制

    处理冲突 当我们使用 index API 更新文档 ,可以一次性读取原始文档,做我们的修改,然后重新索引 整个文档 . 最近的索引请求将获胜:无论最后哪一个文档被索引,都将被唯一存储在 Elastic ...

  4. 一、UC中文调试

    一.只支持UC浏览器,版本号6.2.3831.3,复制resources.pak到UC安装目录下,覆盖同名文件即可

  5. Sass函数:Opacity函数-opacify()、fade-in()函数

    这两个函数是用来对已有颜色的透明度做一个加法运算,会让颜色更加不透明.其接受两个参数,第一个参数是原始颜色,第二个参数是你需要增加的透明度值,其取值范围主要是在 0~1 之间.当透明度值增加到大于 1 ...

  6. MySQLdb-python安装

    安装很简单,步骤如下: 前期:yum -y install python-setuptools,或者自己网上找源码包安装 1. 下载安装包: #wget  https://pypi.python.or ...

  7. iPython清屏命令

    !clear for Unix-like systems !CLS for Windows

  8. Gene Ontology (GO) 注释

    Gene Ontology (GO) 注释  Posted on 2017-06-11 |  In 生信 相似的基因在不同物种中,其功能往往保守的.显然,需要一个统一的术语用于描述这些跨物种的同源基因 ...

  9. 如何通过Dataphin构建数据中台新增100万用户?

    欢迎来到数据中台小讲堂!这一期我们来看看,作为阿里巴巴数据中台(OneData - OneModel.OneID.OneService)方法论的产品载体,Dataphin如何帮助传统零售企业实现数字化 ...

  10. 别人的双11 & 程序员的双11~

    双11,致敬所有的程序员欧巴! 愿代码的世界,只有爱,没有伤害!! ​ 点此参加阿里云双十一拼团活动:https://m.aliyun.com/act/team1111/ 阅读原文