1. 程式人生 > >(計蒜客)迷宮中的英雄(鄰接矩陣BFS)

(計蒜客)迷宮中的英雄(鄰接矩陣BFS)

500年前,Jesse是我國最卓越的劍客。他英俊瀟灑,而且機智過人^_^。

突然有一天,Jesse心愛的公主被魔王困在了一個巨大的迷宮中。Jesse聽說這個訊息已經是兩天以後了,他知道公主在迷宮中還能堅持T天,他急忙趕到迷宮,開始到處尋找公主的下落。 時間一點一點的過去,Jesse還是無法找到公主。最後當他找到公主的時候,美麗的公主已經死了。從此Jesse鬱鬱寡歡,茶飯不思,一年後追隨公主而去了。T_T 500年後的今天,Jesse託夢給你,希望你幫他判斷一下當年他是否有機會在給定的時間內找到公主。 他會為你提供迷宮的地圖以及所剩的時間T。請你判斷他是否能救出心愛的公主。

題目包括多組測試資料。 每組測試資料以三個整數N,M,T(00)開頭,分別代表迷宮的長和高,以及公主能堅持的天數。 緊接著有M行,N列字元,由".","*","P","S"組成。其中 "." 代表能夠行走的空地。 "*" 代表牆壁,Jesse不能從此通過。 "P" 是公主所在的位置。 "S" 是Jesse的起始位置。 每個時間段裡Jesse只能選擇“上、下、左、右”任意一方向走一步。 輸入以0 0 0結束。

如果能在規定時間內救出公主輸出“YES”,否則輸出“NO”。

樣例輸入:

4 4 10
....
....
....
S**P

樣例輸出:

YES

解題思路:

利用佇列實現廣度優先搜尋法

實現3個矩陣,一個用來儲存地圖各店的情況

一個用來儲存點是否訪問

最後一個用來儲存走到各點的距離

程式碼:

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int dir[4][2] = { 0,1,0,-1,-1,0,1,0 };   //上,下,左,右
char mmap[101][101];
int visited[101][101];
int dis[101][101];
struct step
{
	int x;
	int y;
};

int main() {
	
	queue<step> qque;
	int n, m, k;  
	cin >> n >> m >> k; //n表寬,m表長,k表時間
	memset(mmap, 0, sizeof(mmap));
	memset(visited, 0, sizeof(visited));
	memset(dis, 0, sizeof(dis));
	bool flag = false;

	int sx, sy;  //初始位置
	int px, py;

	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < m; ++j) {
			cin >> mmap[i][j];
			if (mmap[i][j] == 'S') {
				sx = i;
				sy = j;
			}
			if (mmap[i][j] == 'P') {
				px = i;
				py = j;
			}
		}
	}

	//初始元素入隊
	step statPoint{ sx,sy };
	visited[sx][sy] = true;
	qque.push(statPoint);

	while (!qque.empty()) {
		step currentPoint = qque.front();
		qque.pop();
		//去訪問下面的四個點
		for (int i = 0; i < 4; ++i) {
			int nextX = currentPoint.x + dir[i][0];
			int nextY = currentPoint.y + dir[i][1];

			if (nextX >= 0 && nextX < n && nextY >= 0 && nextY < m && mmap[nextX][nextY] != '*' && !visited[nextX][nextY]) {
				 dis[nextX][nextY] = dis[currentPoint.x][currentPoint.y] + 1;
				 step nextPoint{ nextX,nextY };
				 visited[nextX][nextY] = true;
				 qque.push(nextPoint);
			}
		}
	}
	
	if (dis[px][py] > k || dis[px][py] == 0) {
		cout << "NO" << endl;
	}
	else {
		cout << "YES" << endl;
	}

	return 0;
}