小樂樂打遊戲 哈爾濱理工大學軟體與微電子學院第八屆程式設計競賽同步賽(高年級)
阿新 • • 發佈:2018-12-04
連結: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; }