链接:https://ac.nowcoder.com/acm/contest/302/E
来源:牛客网
时间限制: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!"。
示例1
输入
3 3 F.. #S# #.E
输出
PIG PIG PIG!
思路:先对火山进行广搜,用数组记下到每个方格的时间,再对人进行广搜,当人到某个方格的时间大于等于火山到这个方格的
时间,说明人可以走
代码:
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m;
const int N=1005;
char map[N][N];
bool vis[N][N];
int t[N][N],step[N][N];
int s_x,s_y,e_x,e_y,f_x,f_y;
struct node{
int x,y;
};
int Next[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
void GetMap()
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin>>map[i][j];
if(map[i][j]=='S')
{
s_x=i;
s_y=j;
}
if(map[i][j]=='E')
{
e_x=i;
e_y=j;
}
if(map[i][j]=='F')
{
f_x=i;
f_y=j;
}
}
}
bool judge(int x,int y)
{
if(x<0||y<0||x>=n||y>=m) return 0;
if(vis[x][y]) return 0;
return 1;
}
void bfs()
{
memset(t,0,sizeof(t));
memset(vis,0,sizeof(vis));
queue<node> q;
node r;
r.x=f_x;
r.y=f_y;
q.push(r);
vis[f_x][f_y]=1;
while(!q.empty())
{
r=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int xx=r.x+Next[i][0];
int yy=r.y+Next[i][1];
if(!judge(xx,yy)) continue;
node z;
z.x=xx;
z.y=yy;
q.push(z);
t[xx][yy]=t[r.x][r.y]+1;
vis[xx][yy]=1;
}
}
}
void BFS()
{
memset(step,0,sizeof(step));
memset(vis,0,sizeof(vis));
queue<node> q;
node r;
r.x=s_x;
r.y=s_y;
q.push(r);
vis[s_x][s_y]=1;
int flag=0;
while(!q.empty())
{
r=q.front();
q.pop();
if(r.x==e_x&&r.y==e_y)
{
flag=1;
break;
}
for(int i=0;i<4;i++)
{
int xx=r.x+Next[i][0];
int yy=r.y+Next[i][1];
if(xx==e_x&&yy==e_y)
{
flag=1;
break;
}
if(!judge(xx,yy)) continue;
if(map[xx][yy]=='#') continue;
if(t[xx][yy]<=step[r.x][r.y]+1) continue;
node z;
z.x=xx;
z.y=yy;
q.push(z);
vis[xx][yy]=1;
step[xx][yy]=step[r.x][r.y]+1;
}
}
if(flag)
cout<<"PIG PIG PIG!"<<endl;
else
cout<<"A! WO SI LA!"<<endl;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
GetMap();
bfs();//先对火山进行遍历
BFS();//再对人进行遍历
}
return 0;
}