Gym 101047E Escape from Ayutthaya

Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

Description

standard input/output

Ayutthaya was one of the first kingdoms in Thailand, spanning since its foundation in 1350 to its collapse in 1767. The organization of Extraordinary Mystery Investigators (IME, in their language) aims to uncover the secrets of this ancient kingdom. One of IME's most notorious historians is Márcio "the indispensable" Himura. He is currently researching the laws and punishments in place during King Ramathibodi I's rule. Recent discoveries suggest how Ramathibodi I used to punish the subjects that did not convert to Theravada Buddhism, the religion he adopted.

The punishment involved trapping the accused prisoner in a room with a single exit and to light up a fire. If the prisoner could manage to reach the exit before getting caught on fire, she or he was forgiven and allowed to live. Márcio has access to some records that describe the floorplans of the rooms where this punishment took place. However, there are no documents asserting whether the prisoners were forgiven. Márcio would like to know whether each of these prisoners had any chance at all of having been forgiven. For that, Márcio represented each room as a grid with N rows and M columns, where each position has a symbol with the following meaning

where "start" is the person's initial position in the room when fire has been lit up. Moreover, Márcio imposed the following constraints in his model:

  • Fire spreads in the four cardinal directions (N, S, E, O) at the speed of one cell per minute.
  • The prisoners can also move in these four directions at the same speed.
  • Neither fire nor the prisoners can walk through a wall.
  • If the prisoner and fire occupy the same position at any instant, the prisoner dies instantaneously.

You are a member of IME and Márcio would like to know if you deserve your position. He has charged you with the task of determining whether a prisoner had any chance to be forgiven.

Input

The first line has a single integer T, the number if test cases.

Each instance consists of several lines. The first line contains two integers, N and M. Each of the following N lines contains exactly Msymbols representing, as described above, a room from which the prisoner must escape.

Limits

  • 1 ≤ T ≤ 100
  • The sum of the sizes of the matrices in all test cases will not exceed 2 cdot106
  • 1 ≤ N ≤ 103
  • 1 ≤ M ≤ 103

Output

For each instance, print a single line containing a single character. Print Y if the prisoner had any chance of being forgiven; otherwise, print N.

Sample Input

Input
3
4 5
....S
.....
.....
F...E
4 4
...S
....
....
F..E
3 4
###S
####
E..F
Output
Y
N
N
/*/
题意:
国王把犯人关在一个迷宫里,然后在迷宫里点火,只有一个出口,如果犯人逃出来了,将会被释放,给出这个迷宫的图和点火位置,问人能不能逃出。 很明显是BFS,但是一开始想错了,找到S和F两个点去BFS的,然后比较返回的最小步数,如果火走到E的步数小于人的步数坑定会被烧死的。但是少考虑了有多个火把的情况WA了一次。然后改好,再交了一次,发现前面的样例过的挺快,以为要A了,结果T在了text 6 噗。。。接着各种奇葩剪枝出来了。一直T在text 6 这组数据真的很可以。。。 在和队友冷静下来讨论了一会,突然灵感一闪,可以从起点BFS到终点,为何不能从终点往起点BFS顺便一次就把F和S全找了。 噗。。。 AC代码:
/*/
#include"algorithm"
#include"iostream"
#include"cstring"
#include"cstdio"
#include"string"
#include"vector"
#include"queue"
#include"cmath"
using namespace std;
#define FK(x) cout<<"["<<x<<"]"<<endl
#define memset(x,y) memset(x,y,sizeof(x))
#define memcpy(x,y) memcpy(x,y,sizeof(x))
#define bigfor(x) for(int qq=1;qq<=x;qq++)
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w+",stdout) const int MX = 1e3+100;
int dir[4][2]= {{0,1},{1,0},{0,-1},{-1,0}};
int n,m;
bool vis[MX][MX];
char maps[MX][MX];
struct node {
int x,y,step;
node() {};
node(int xx,int yy,int s):x(xx),y(yy),step(s) {};
}; int BFS(int x,int y) {
node pe(0,0,1e9+10);
node fir(0,0,1e9+10);
memset(vis,0);
queue< node > Q;
while(!Q.empty())Q.pop();
vis[x][y]=1;
int sign=0;
Q.push(node(x,y,0));
while(!Q.empty()) {
node a=Q.front();
Q.pop();
if(maps[a.x][a.y]=='S'){
pe=a;
}
if(a.step>pe.step)return 1;
if(maps[a.x][a.y]=='F'){
return 0;
}
for(int i=0; i<4; i++) {
int xx=a.x+dir[i][0];
int yy=a.y+dir[i][1];
if(xx<0||yy<0||xx>=n||yy>=m||vis[xx][yy]) continue;
if(maps[xx][yy]=='#') continue;
vis[xx][yy]=1;
Q.push(node(xx,yy,a.step+1));
}
}
return 0;
} int main() {
int T;
cin>>T;
bigfor(T) {
scanf("%d%d",&n,&m);
for(int i=0; i<n; i++) {
scanf("%s",maps[i]);
}
int flag=0;
int ans=0;
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
if(maps[i][j]=='E') {
ans=BFS(i,j);
flag=1;
}
if(flag)break;
}
if(flag)break;
}
printf("%s\n",ans==1?"Y":"N");
}
return 0;
} /*/ 20
3 7
.......
F..E..S
....... 3 7
.......
.F.E..S
....... 3 7
F......
...E...
.....S. 3 7
......S
E......
......F 3 7
.....S.
E......
...F..F 3 7
.....S.
E...###
.F..#.F /*/

  

 

ACM: Gym 101047E Escape from Ayutthaya - BFS的更多相关文章

  1. bnu 52037 Escape from Ayutthaya

    Escape from Ayutthaya Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on CodeFo ...

  2. ACM: Gym 100935F A Poet Computer - 字典树

    Gym 100935F A Poet Computer Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d &am ...

  3. Codeforces Gym 100187E E. Two Labyrinths bfs

    E. Two Labyrinths Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/prob ...

  4. Gym 101617J Treasure Map(bfs暴力)

    http://codeforces.com/gym/101617/attachments 题意:给出一个图,每个顶点代表一个金矿,每个金矿有g和d两个值,g代表金矿初始的金子量,d是该金矿每天的金子量 ...

  5. Gym - 100971J (思维+简单bfs)

    题目链接:http://codeforces.com/gym/100971/problem/J J. Robots at Warehouse time limit per test 2.0 s mem ...

  6. Gym - 100187E E - Two Labyrinths —— bfs

    题目链接:http://codeforces.com/gym/100187/problem/E 题解:一开始做的时候是将两幅图合并,然后直接bfs看是否能到达终点.但这种做法的错的,因为走出来的路对于 ...

  7. ACM: Gym 101047M Removing coins in Kem Kadrãn - 暴力

     Gym 101047M Removing coins in Kem Kadrãn Time Limit:2000MS     Memory Limit:65536KB     64bit IO Fo ...

  8. ACM: Gym 101047K Training with Phuket's larvae - 思维题

     Gym 101047K Training with Phuket's larvae Time Limit:2000MS     Memory Limit:65536KB     64bit IO F ...

  9. ACM: Gym 101047B Renzo and the palindromic decoration - 手速题

     Gym 101047B  Renzo and the palindromic decoration Time Limit:2000MS     Memory Limit:65536KB     64 ...

随机推荐

  1. 生产环境中,数据库升级维护的最佳解决方案flyway

    官网:https://flywaydb.org/ 转载:http://casheen.iteye.com/blog/1749916 1.  引言 想到要管理数据库的版本,是在实际产品中遇到问题后想到的 ...

  2. Android 常用开发工具以及Mac常用软件

    Android 常用的开发工具记录.其中包括AndroidStudio(IDEA)插件.Mac 上好用的软件以及国内知名Android开发者博客等. Android Studio 插件 codota ...

  3. 使用python抓取百度搜索、百度新闻搜索的关键词个数

    由于实验的要求,需要统计一系列的字符串通过百度搜索得到的关键词个数,于是使用python写了一个相关的脚本. 在写这个脚本的过程中遇到了很多的问题,下面会一一道来. ps:我并没有系统地学习过pyth ...

  4. linQ学习笔记之三高级语句

    linq语句查询执行的时机 第一步获取数据源 int [] obejct = new int[]{1,2,3,4,5,6,7,8,9} 第二步定义查询 var even = numbers.where ...

  5. 前后端分离中,Gulp实现头尾等公共页面的复用

    前言 通常我们所做的一些页面,我们可以从设计图里面看出有一些地方是相同的.例如:头部,底部,侧边栏等等.如果前后端分离时,制作静态页面的同学,对于这些重复的部分只能够通过复制粘贴到新的页面来,如果页面 ...

  6. Mac系统下开启和关闭隐藏文件的方法

    在Mac下找到终端,输入以下命令(注意区分大小写): 显示Mac隐藏文件的命令: defaults write com.apple.finder AppleShowAllFiles -bool tru ...

  7. dom4j使用总结

    1.加载Xml 从文件加载 SAXReader reader = new SAXReader(); String filePath = "/xmlfile/" + fileName ...

  8. 自定义类似MessageBox小窗体操作

    1.实际小窗体界面如下 2.代码如下 private void InputBox(string caption,string orderNo) { Form InputForm = new Form( ...

  9. CC2540自己的配置文件

    首先要指出,字段属性有notify的不能同时有read,write属性,别问哥,哥也不知道,反正我做的就不能notify,只能read,write. 分享的程序段第一字段有notify属性,第二字段r ...

  10. 整数转IP地址

    将一个整数,比如1567898765转换为xxx.xxx.xxx.xxx的IP地址的形式, 以下是源代码 union IPNode{ unsigned int addr; struct { unsig ...