Description

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

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

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

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

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

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

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

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

根据已知条件,判断两人能否成功逃脱险境,如果可以,输出最短逃离时间,否则输出T_T。

Input

第一行输入一个整数t,表示一共的测试数据组数。

第二行输入两个整数n,m,表示幼儿园的大小。

接下来n行,每行m个字符,表示此格子是什么元素。

t<=200

3<=n<=30

3<=M<=30

保证图中有一个起点,一个出口,一个火灾源处.

Output

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

Sample Input

35 5*...........S#....E......5 5...#*..#S#...##....E.....5 5.....S......*#....E......

Sample Output

2T_TT_T

HINT

为了防止孩子们嬉戏中受伤,墙体是橡胶制作的,可以燃烧的哦。

Source

思路:

一开始想的是。。。走的时候考虑火已经蔓延。。。我也不知道为什么这么考虑,然后大哥说可能他第一步就直接到达了= =、是啊,所以不能这么考虑啊,还是人先走,然后火后走,BFS就是那么按部就班,感觉真是蠢哭,只要能走到就进队,然后在出队的时候判断一下是不是已经走到了。

然后wa到怀疑人生啊!!!卧槽!!!卧槽!!!因为我天真的判断了一下出队的火的蔓延,然后入队那边火的蔓延没有判断。。。。

这题BFS是:

1.搜索一定是按部就班的!

2.搜索你踏马的判断条件,各种限制都不能省啊

哎。。。贴一发代码;

#include<bits/stdc++.h>
using namespace std;
typedef long long LL; const int N=50; int huo[N][N];
char ma[N][N];
int n,m;
int sx,sy;
int ex,ey;
struct asd{
int x,y;
int step;
};
int dx[4]={1,-1,0,0};
int dy[4]={0,0,-1,1}; void BFS()
{
bool vis[N][N];
queue<asd>q;
memset(vis,0,sizeof(vis));
asd now,next;
now.x=sx;
now.y=sy;
now.step=0;
vis[sx][sy]=1; q.push(now); while(!q.empty())
{
now=q.front();
q.pop();
if(now.x==ex&&now.y==ey) //出队的时候先考虑是不是到了,然后考虑烧到了没
{
printf("%d\n",now.step);
return;
}
if(huo[now.x][now.y]<=now.step)
continue;
for(int i=0;i<4;++i)
{
int x=now.x+dx[i];
int y=now.y+dy[i];
if(x<0||y<0||x>=n||y>=m||vis[x][y]||ma[x][y]=='#'||huo[x][y]<now.step+1)//就是这里!!!
continue;
vis[x][y]=1;
next.step=now.step+1;
next.x=x;
next.y=y;
q.push(next);
}
}
puts("T_T");
} void DEBUG()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
printf("%3d",huo[i][j]);
puts("");
}
} void init_huo()
{
memset(huo,-1,sizeof(huo));
int flag=0;
int x,y;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(ma[i][j]=='*')
{
flag=1;
x=i;
y=j;
huo[i][j]=0;
break;
}
}
if(flag) break;
}
for(int i=0;i<n;++i)
{
for(int j=0;j<m;j++)
{
if(huo[i][j]==-1)
huo[i][j]=max(abs(i-x),abs(j-y));
}
}
//DEBUG();
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%s",ma[i]);
int flag=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(ma[i][j]=='S')
{
sx=i;
sy=j;
flag+=1;
}
if(ma[i][j]=='E')
{
ex=i;
ey=j;
flag+=1;
}
if(flag==2) break;
}
if(flag==2) break;
}
init_huo();
BFS();
}
return 0;
}
/* 5 5
*....
.S...
...#.
.....
....E
5 5
*..E.
.....
..S#.
.....
.....
5 5
*....
.....
..S#.
..#E.
.....
5 5
#....
.....
..S*.
..E..
.....
5 5
#....
..S..
E..*.
.....
..... */

hrbust1444 逃脱 【BFS】的更多相关文章

  1. 地牢逃脱 (BFS)

    题意:给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指 ...

  2. HDU1728 从迷宫中逃脱 【方向BFS】

    从迷宫中逃脱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. 逃脱 (简单BFS)

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

  4. Escape(多记一个方向状态的BFS)迷宫逃脱

    题意:https://www.nitacm.com/problem_show.php?pid=2266 vis记[x][y][dir]三个状态就行. 引用:https://blog.csdn.net/ ...

  5. 地牢逃脱(BFS(广度优先搜索))

    题目描述 给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一 ...

  6. Dungeon Master(逃脱大师)-BFS

    Dungeon Master Description You are trapped in a 3D dungeon and need to find the quickest way out! Th ...

  7. BFS(判断状态) HDOJ 3533 Escape

    题目传送门 题意:一个人从(0, 0)逃往(n, m),地图上有朝某个方向开炮的炮台,问最少逃脱步数 分析:主要在状态是否OK,当t时刻走到(x,y),炮台是否刚好打中,因为只能是整数,所以用整除判断 ...

  8. [编程题] 合唱团 && 地闹逃脱

    1. 合唱团 有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最 ...

  9. NOIP模拟赛 密室逃脱

    密室逃脱(maze.*) 即使czhou没有派出最强篮球阵容,机房篮球队还是暴虐了校篮球队.为了不打击校篮球队信心,czhou决定改变训练后的活动.近来,江大掌门的徒弟徒孙们纷纷事业有成,回到母校为机 ...

随机推荐

  1. 【BZOJ4476】[Jsoi2015]送礼物 分数规划+RMQ

    [BZOJ4476][Jsoi2015]送礼物 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物.萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都排成 ...

  2. libcurl以get方式请求服务器端文件

    static size_t callbackfunction(void *ptr, size_t size, size_t nmemb, void* userdata){    FILE* strea ...

  3. MySql in子句 效率低下优化(亲测有效,从200秒变1秒)

    MySql in子句 效率低下优化 背景: 更新一张表中的某些记录值,更新条件来自另一张含有200多万记录的表,效率极其低下,耗时高达几分钟. update clear_res set candele ...

  4. HZNU 与班尼特·胡迪一起攻破浮空城 【DP】

    题目链接 http://acm.hznu.edu.cn/OJ/problem.php?id=2264 思路 从终点往起点走 然后每次更新状态 因为要满足 最短路线 所以其实 只能是 往左走,往下走 或 ...

  5. 最大流EK算法

    给定一个有向图G=(V,E),把图中的边看作 管道,每条边上有一个权值,表示该管道 的流量上限.给定源点s和汇点t,现在假设 在s处有一个水源,t处有一个蓄水池,问从 s到t的最大水流量是多少? 网络 ...

  6. Ext rowcontextmenu回调

    今天栽了大跟头,,,, EXT js右键可以获取到选中的那一列的索引值,只需在回调函数中取到那一列的数据就可以ok,不用再费尽心思的费用执行click的事件 grid.on("rowcont ...

  7. animation steps属性实现帧动画

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta na ...

  8. BestCoder7 1001 Little Pony and Permutation(hdu 4985) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4985 题目意思:有 n 个数,对于第 i 个数给出 σ(i) 的值.求出互不相交的循环的个数,并输出每 ...

  9. BestCoder3 1001 Task schedule(hdu 4907) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4907 题目意思:给出工作表上的 n 个任务,第 i 个任务需要 ti 这么长的时间(持续时间是ti ~ ...

  10. map的详细用法 (转

    map的详细用法: map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能 力,由于这个特性,它完成有可能在我 ...