(計蒜客)迷宮中的英雄(鄰接矩陣BFS)
阿新 • • 發佈:2018-12-18
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; }