哈理工院赛-小乐乐打游戏

题目描述

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

转载请注明出处!!!

如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值