题目描述
小乐乐觉得学习太简单了,剩下那么多的时间好无聊,于是便想打游戏。
最近新出了一个特别火的游戏,叫吃猪,小乐乐准备玩一玩。
吃猪游戏很简单,给定一个地图,大小为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!
思路:
两个BFS,注意下细节即可。。。
代码:
#include <bits/stdc++.h>
using namespace std;
struct node{
int x,y,foot;
};
int dx[5]={0,1,-1,0},n,m;
int dy[5]={1,0,0,-1};
char a[1001][1001];
int vis[1001][1001];
int footstep[1001][1001];
int bfs(int startx,int starty){
deque<node>Q;
node start;
start.x = startx;
start.y = starty;
start.foot = 0;
vis[startx][starty] = 1;
Q.push_back(start);
while(!Q.empty()){
node now = Q.front();
Q.pop_front();
// printf("x=%d y=%d foot = %d\n",now.x,now.y,now.foot);
for(int i = 0; i < 4; i++){
int x = now.x+dx[i];
int y = now.y+dy[i];
if(x>=0&&x<n &&y>=0&&y<m && a[x][y] != '#' && a[x][y] != 'F'&& !vis[x][y] && now.foot+1<=footstep[x][y]){
if(a[x][y] == 'E'){
return now.foot+1;
}
vis[x][y] = 1;
node then;
then.x = x;
then.y = y;
then.foot = now.foot+1;
Q.push_back(then);
}
}
}
Q.clear();
return 0;
}
void bfs1(int startx,int starty){
deque<node>Q;
node start;
start.x = startx;
start.y = starty;
start.foot = 0;
footstep[startx][starty] = 0;
vis[startx][starty] = 1;
Q.push_back(start);
while(!Q.empty()){
node now = Q.front();
Q.pop_front();
for(int i = 0; i < 4; i++){
int x = now.x+dx[i];
int y = now.y+dy[i];
if(x>=0&&x<n &&y>=0&&y<m &&!vis[x][y]){
footstep[x][y] = now.foot+1;
vis[x][y] = 1;
node then;
then.x = x;
then.y = y;
then.foot = now.foot+1;
Q.push_back(then);
}
}
}
Q.clear();
}
int main(){
while(~scanf("%d%d",&n,&m)){
int Sx,Sy,Ex,Ey;
for(int i = 0; i < n; i++){
scanf("%s",a[i]);
for(int j = 0; j < m; j++){
if(a[i][j] == 'S'){
Sx = i,Sy = j;
}else if(a[i][j] == 'F'){
Ex = i,Ey = j;
}
}
}
memset(footstep,0,sizeof(footstep));
memset(vis,0,sizeof(vis));
bfs1(Ex,Ey);
memset(vis,0,sizeof(vis));
int ans1 = bfs(Sx,Sy);
if(ans1){
printf("PIG PIG PIG!\n");
}else{
printf("A! WO SI LA!\n");
}
}
return 0;
}
如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢