admin 管理员组

文章数量: 1087139

牛客网

链接:
来源:牛客网

时间限制: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!"。

输入

3 3
F..
#S#
#.E

输出

PIG PIG PIG!

解题思路

这道题其实就是让你判断一下岩浆和小乐乐谁先到达终点。直接用BFS搜索一下就行了,只要岩浆到终点的距离小于小乐乐到终点的距离,那么小乐乐肯定是到不了的。注意一下岩浆的距离是怎样求的。

#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = 1005;
const int inf = 99999999;
int n, m, ex, ey, len;
int map[N][N], vis[N][N];
int nex[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
struct edge {int u, v, flag;
}t;
int BFS(int u, int v) {vis[u][v] = 1;queue <edge> Q;Q.push((edge){u, v, 0});while (!Q.empty()) {t = Q.front();Q.pop();for (int i = 0; i < 4; i++) {int tx = t.u + nex[i][0];int ty = t.v + nex[i][1];if (t.flag + 1 > len)return inf;if (tx == ex && ty == ey)return t.flag + 1;if (tx < 0 || tx >= n || ty < 0 || ty >= m)continue;if (map[tx][ty] && !vis[tx][ty]) {vis[tx][ty] = 1;Q.push((edge){tx, ty, t.flag + 1});}}}return inf;
}
int main() {char s[N];int ans, sx, sy, px, py;while (~scanf("%d%d", &n, &m)) {memset(vis, 0, sizeof(vis));for (int i = 0; i < n; i++) {scanf("%s", s);for (int j = 0; j < m; j++) {if (s[j] != '#') {map[i][j] = 1;switch (s[j]) {case 'S': sx = i; sy = j; break;case 'E': ex = i; ey = j; break;case 'F': px = i; py = j; break;}}else map[i][j] = 0;}}len = abs(px - ex) + abs(py - ey);ans = BFS(sx, sy);if (ans <= len)printf("PIG PIG PIG!\n");else printf("A! WO SI LA!\n");}return 0;
}

 

本文标签: 牛客网