时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
小乐乐觉得学习太简单了,剩下那么多的时间好无聊,于是便想打游戏。
最近新出了一个特别火的游戏,叫吃猪,小乐乐准备玩一玩。
吃猪游戏很简单,给定一个地图,大小为n*m,在地图中会随机出现一个火山口,只要小乐乐能逃离这个地图,他便能吃猪!
但吃鸡远没有那么简单:
1.小乐乐每走一次只能上下左右四个方向中走一步。
2.小乐乐每走一步,火山喷发的岩浆就会向四周蔓延一个格子,所有岩浆走过的地方都视为被岩浆覆盖。
3.小乐乐碰到岩浆就会死。
4.地图中还有很多障碍,使得小乐乐不能到达,但是岩浆却可以把障碍融化。
5.小乐乐只有走到题目给定的终点才算游戏胜利,才能吃猪。
小乐乐哪见过这场面,当场就蒙了,就想请帮帮他,告诉他是否能吃猪。
输入描述:
多组样例输入

第一行给定n,m,(1 <= n, m <= 1000)代表地图的大小。

接下来n行,每一行m个字符,代表地图,对于每一个字符,如果是’.’,代表是平地,'S’代表小乐乐起始的位置,
‘E’代表终点,’#'代表障碍物,'F’代表火山口。
输出描述:
输出只有一行。如果小乐乐能吃猪,输出"PIG PIG PIG!"。否则输出"A! WO SI LA!"。
示例
输入
3 3
F…
#S#
#.E

输出
PIG PIG PIG!

注意:<mark>本题四周是上下左右</mark>,而不是八个方向。

思路1:两次bfs,先搜火山再搜人
思路2:一次bfs,搜出人到出口的最小步数,和火山到出口的最小步数比较,如果前者小,说明岩浆不会跑在人的前面

#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
    int x,y;
    int step;
}p,tp;
int t[4][2]={1,0,-1,0,0,1,0,-1};
char map[1005][1005];
bool book[1005][1005];
int n,m,sx,sy,ex,ey,fx,fy;
int bfs(){
    queue<node> q;
    int last=0;
    p.x=sx,p.y=sy,p.step=0;
    q.push(p);
    book[sx][sy]=true;
    book[fx][fy]=true;
    while(!q.empty()){
        p=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            tp.x=p.x+t[i][0];
            tp.y=p.y+t[i][1];
            if(tp.x>=1&&tp.x<=n&&tp.y>=1&&tp.y<=m&&!book[tp.x][tp.y]&&map[tp.x][tp.y]!='#'){
                tp.step=p.step+1;
                q.push(tp);
                book[tp.x][tp.y]=true;
                if(tp.x==ex&&tp.y==ey)
                return tp.step;
            }
        }
    }
    return -1; 
}
int main(){
    while(~scanf("%d%d",&n,&m)){
        memset(book,0,sizeof(book));
        getchar();
        for(int i=1;i<=n;i++){
            scanf("%s",map[i]+1);
            for(int j=1;j<=m;j++){
                if(map[i][j]=='F'){
                    fx=i,fy=j;
                }
                else if(map[i][j]=='S'){
                    sx=i,sy=j;
                }
                else if(map[i][j]=='E'){
                    ex=i,ey=j;
                }
            }
        }
        int step=bfs();
        int h=abs(fx-ex)+abs(fy-ey);//火山到出口的最小步数
        if(step<h&&step!=-1) printf("PIG PIG PIG!\n");
        else printf("A! WO SI LA!\n");
    }
    return 0;
}