zoukankan      html  css  js  c++  java
  • ACM: Gym 101047E Escape from Ayutthaya

    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 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
    ",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
    
    
    /*/
    
    
    

      

     


  • 相关阅读:
    Wijmo 更优美的jQuery UI部件集:从wijwizard和wijpager开始
    设计规范基础
    libgdx的tmx地图处理工具gdxtiledpreprocessor.jar(TiledMapPacker)修正版
    Zookeeper简介
    翻译:Contoso 大学 6 – 更新关联数据
    jquery 插件ztree的应用简单的树(tree)
    使用EF构建企业级应用
    可复用的WPF或者Silverlight应用程序和组件设计(1)——应用程序级别
    Castor简单介绍
    Eclipse各种书籍资料整理包括书籍介绍和下载
  • 原文地址:https://www.cnblogs.com/HDMaxfun/p/5796899.html
Copyright © 2011-2022 走看看