1. 程式人生 > >*【牛客 - 301哈爾濱理工大學軟體與微電子學院第八屆程式設計競賽同步賽(高年級)】小樂樂打遊戲(bfs,雙元bfs,思維)

*【牛客 - 301哈爾濱理工大學軟體與微電子學院第八屆程式設計競賽同步賽(高年級)】小樂樂打遊戲(bfs,雙元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!"。

示例1

輸入

複製

3 3
F..
#S#
#.E

輸出

複製

PIG PIG PIG!

解題報告:

   之前cf上也做過一個類似的、、看題的時候還真沒想到這種神奇的做法。。。要是我就直接把火山也讓他蔓延了、、、還是思維不是很巧妙啊、、這兩種方法倒是都沒啥問題,,但是這樣寫就程式碼量小很多了。、。改天再那樣寫一遍、、

AC程式碼:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
const ll mod=1e9+7;
char a[1005][1005];
bool vis[1005][1005];
int t1[5]= {0,0,1,-1};
int t2[5]= {1,-1,0,0};
int n,m,sx,sy,hx,hy;

struct note {
	int x,y,s;
};
queue<note> p;

int cal(int tx,int ty) {
	return abs(tx-hx)+abs(ty-hy);
}

int bfs() {
	while (p.size()) p.pop();
	memset(vis,0,sizeof(vis));
	p.push(note {sx,sy,0});

	int tx,ty;
	while (p.size()) {
		note x=p.front();
		p.pop();
		if (a[x.x][x.y]=='E') return 1;

		if (vis[x.x][x.y]) continue;
		vis[x.x][x.y]=1;
		for (int q=0; q<4; q++) {
			tx=x.x+t1[q];
			ty=x.y+t2[q];
			if (tx<0||tx>=n||ty<0||ty>=m) continue;
			if (vis[tx][ty]||a[tx][ty]=='#') continue;
			if (x.s+1>=cal(tx,ty)) continue;
			p.push(note {tx,ty,x.s+1});
		}
	}

	return 0;
}



int main() {
	while (scanf("%d%d",&n,&m)==2&&n&&m) {
		for (int q=0; q<n; q++) {
			scanf("%s",a[q]);
			for (int w=0; w<m; w++) {
				if (a[q][w]=='S') {
					sx=q;
					sy=w;
				}
				if (a[q][w]=='F') {
					hx=q;
					hy=w;
				}
			}
		}

		if (bfs()) printf("PIG PIG PIG!\n");
		else printf("A! WO SI LA!\n");
	}

	return 0;
}