1. 程式人生 > >小樂樂打遊戲 哈爾濱理工大學軟體與微電子學院第八屆程式設計競賽同步賽(高年級)

小樂樂打遊戲 哈爾濱理工大學軟體與微電子學院第八屆程式設計競賽同步賽(高年級)

連結:https://ac.nowcoder.com/acm/contest/301/G
來源:牛客網
 

題目描述

        小樂樂覺得學習太簡單了,剩下那麼多的時間好無聊,於是便想打遊戲。
        最近新出了一個特別火的遊戲,叫吃豬,小樂樂準備玩一玩。
        吃豬遊戲很簡單,給定一個地圖,大小為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!"。
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#include<cstring>
using namespace std;
const int MAX_N = 1000;
char maze[MAX_N][MAX_N]; //迷宮
bool vis[MAX_N][MAX_N]; //標記當前位置是否被訪問過
int n, m;
int xy[4][2] = { {1,0},{0,1},{-1,0},{0,-1} }; //移動方向
struct node
{
	int x;
	int y;
	int steps;
}s,e,f; //定義起點,終點,火山為結構體變數
bool bfs()
{
	memset(vis, 0, sizeof(vis)); //初始化標記陣列
	queue<node> que;
	que.push(s);
	vis[s.x][s.y] = 1;   //起點入隊並標記
	while (que.size())  //一直迴圈到佇列為空或者到達終點
	{
		node now = que.front();
		que.pop();  //對頭元素出隊
		if (now.x == e.x&&now.y == e.y)
			return true;  //如果到達終點,返回true
		for (int i = 0; i < 4; i++)  //向四個方向開始遍歷
		{
			node next = now;
			next.x += xy[i][0];
			next.y += xy[i][1];
			next.steps += 1;  //記錄下一步的位置和步數
			if (!vis[next.x][next.y] && next.x >= 0 && next.x < n&&next.y >= 0 && next.y<m&&maze[next.x][next.y] != '#'&&abs(f.x - next.x) + abs(f.y - next.y)>next.steps)
			{//步數即時間,火山到達這個位置需要的步數大於人需要的步數才可行
				que.push(next);
				vis[next.x][next.y] = 1; //將滿足條件的位置入隊並標記
			}
		}
	}
	return false;
}
int main()
{
	while (~scanf("%d%d", &n, &m))
	{
		for (int i = 0; i<n; i++)
			for (int j = 0; j < m; j++)
			{
				scanf(" %c", &maze[i][j]);
				if (maze[i][j] == 'S')
					s.x = i, s.y = j, s.steps = 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()) puts("PIG PIG PIG!");
		else puts("A! WO SI LA!");
	}
	return 0;
}