小乐乐打游戏
题目描述
小乐乐觉得学习太简单了,剩下那么多的时间好无聊,于是便想打游戏。
最近新出了一个特别火的游戏,叫吃猪,小乐乐准备玩一玩。
吃猪游戏很简单,给定一个地图,大小为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!
题解:
入门BFS 分别记录 起始位置,火的位置,终止位置,BFS跑即可
但是在判断条件上加上abs(next.x-F.x)+abs(next.y-F.y)>next.time
其中 next.x表示下一步的横坐标,next.y表示下一步的纵坐标 next.step 表示走过步数(也可以理解为时间)
只需要火山与人的距离大于火山蔓延的步数即可 (也可以想象成一个人去追击另一个人)这两个人之间的距离要大于追击人走的距离
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int mx = 1e9+5;
#define ms(a,b) memset(a,b,sizeof(a))
int n,m;
char maze[1005][1005];
int vis[1005][1005];
int dir[4][2]= {0,1,1,0,-1,0,0,-1};
struct node
{
int x;
int y;
int step;
} S,F,E;
int BFS()
{
ms(vis,0);
queue<node>Q;
vis[S.x][S.y]=1;
Q.push(S);
while(!Q.empty())
{
node now=Q.front();
Q.pop();
if(now.x==E.x && now.y==E.y)
return 1;
for(int i=0; i<4; i++)
{
node next=now;
next.x=now.x+dir[i][0];
next.y=now.y+dir[i][1];
next.step+=1;
if(!vis[next.x][next.y] && maze[next.x][next.y]!='#' && abs(next.x-F.x)+abs(next.y-F.y)>next.step)
{///abs(next.x-F.x)+abs(next.y-F.y)>next.step 表示火山与人的距离大于火山的步数
if(1<=next.x && next.x<=n && 1<=next.y && next.y<=m)
vis[next.x][next.y]=1,Q.push(next);
}
}
}
return 0;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cin>>maze[i][j];
if(maze[i][j]=='S')
S.x=i,S.y=j,S.step=0;
if(maze[i][j]=='F')
F.x=i,F.y=j;
if(maze[i][j]=='E')
E.x=i,E.y=j;
}
}
if(BFS())cout<<"PIG PIG PIG!"<<endl;
else cout<<"A! WO SI LA!"<<endl;
}
return 0;
}