阿爾吉儂是一隻聰明又慵懶的小白鼠,它最擅長的就是走各類各樣的迷宮。ios
今天它要挑戰一個很是大的迷宮,研究員們爲了鼓勵阿爾吉儂儘快到達終點,就在終點放了一塊阿爾吉儂最喜歡的奶酪。oop
如今研究員們想知道,若是阿爾吉儂足夠聰明,它最少須要多少時間就能吃到奶酪。spa
迷宮用一個R×C的字符矩陣來表示。code
字符 S 表示阿爾吉儂所在的位置,字符 E 表示奶酪所在的位置,字符 # 表示牆壁,字符 . 表示能夠通行。blog
阿爾吉儂在 1 個單位時間內能夠從當前的位置走到它上下左右四個方向上的任意一個位置,但不能走出地圖邊界。string
第一行是一個正整數T,表示一共有T組數據。it
每一組數據的第一行包含了兩個用空格分開的正整數R和C,表示地圖是一個R×C的矩陣。io
接下來的R行描述了地圖的具體內容,每一行包含了C個字符。字符含義如題目描述中所述。保證有且僅有一個 S 和 E。class
對於每一組數據,輸出阿爾吉儂吃到奶酪的最少單位時間。stream
若阿爾吉儂沒法吃到奶酪,則輸出「oop!」(只輸出引號裏面的內容,不輸出引號)。
每組數據的輸出結果佔一行。
1<T≤10,
2≤R,C≤200
3 3 4 .S.. ###. ..E. 3 4 .S.. .E.. .... 3 4 .S.. #### ..E.
5 1 oop!
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <queue> #define x first #define y second using namespace std; typedef pair<int, int> PII; const int N = 210; int r,c; char g[N][N]; int dist[N][N]; int bfs(PII start, PII end) { queue<PII> q; memset(dist, -1, sizeof dist); dist[start.x][start.y] = 0; q.push(start); int dx[4] = {-1, 0, 1, 0}; int dy[4] = {0, 1, 0, -1}; while (q.size()) { PII t = q.front(); q.pop(); for (int i = 0; i < 4; i ++) { int x = t.x + dx[i], y = t.y + dy[i]; if(x < 0 || x >= r || y < 0 || y >= c) continue; if(g[x][y] == '#') continue; // 障礙物 if(dist[x][y] != -1) continue; // 走過的 dist[x][y] = dist[t.x][t.y] + 1; if (end == make_pair(x, y)) return dist[x][y]; q.push({x, y}); } } return -1; } int main() { int T; scanf("%d", &T); while(T --) { scanf("%d%d", &r, &c); for(int i = 0; i < r; i ++) scanf("%s", g[i]); PII start, end; for (int i = 0; i < r; i ++) for (int j = 0; j < c; j ++) if (g[i][j] == 'S') start = {i, j}; else if (g[i][j] == 'E') end = {i, j}; int distance = bfs(start, end); if (distance == -1) printf("oop!\n"); else printf("%d\n", distance); } return 0; }