小乐乐打游戏 (入门BFS)

                                           小乐乐打游戏

题目描述

        小乐乐觉得学习太简单了,剩下那么多的时间好无聊,于是便想打游戏。
        最近新出了一个特别火的游戏,叫吃猪,小乐乐准备玩一玩。
        吃猪游戏很简单,给定一个地图,大小为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;
}

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值