獻給阿爾吉儂的花束
題目
阿爾吉儂是一隻聰明又慵懶的小白鼠,它最擅長的就是走各種各樣的迷宮。
今天它要挑戰一個非常大的迷宮,研究員們爲了鼓勵阿爾吉儂儘快到達終點,就在終點放了一塊阿爾吉儂最喜歡的奶酪。
現在研究員們想知道,如果阿爾吉儂足夠聰明,它最少需要多少時間就能喫到奶酪。
迷宮用一個 R×C 的字符矩陣來表示。
字符 S 表示阿爾吉儂所在的位置,字符 E 表示奶酪所在的位置,字符 # 表示牆壁,字符 . 表示可以通行。
阿爾吉儂在 1 個單位時間內可以從當前的位置走到它上下左右四個方向上的任意一個位置,但不能走出地圖邊界。
輸入格式
第一行是一個正整數 T,表示一共有 T 組數據。
每一組數據的第一行包含了兩個用空格分開的正整數 R 和 C,表示地圖是一個 R×C 的矩陣。
接下來的 R 行描述了地圖的具體內容,每一行包含了 C 個字符。字符含義如題目描述中所述。保證有且僅有一個 S 和 E。
輸出格式
對於每一組數據,輸出阿爾吉儂喫到奶酪的最少單位時間。
若阿爾吉儂無法喫到奶酪,則輸出“oop!”(只輸出引號裏面的內容,不輸出引號)。
每組數據的輸出結果佔一行。
數據範圍
輸入樣例
3
3 4
.S…
###.
…E.
3 4
.S…
.E…
…
3 4
.S…
…E.
輸出樣例
5
1
oop!
題解
思路
- BFS遍歷
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
typedef pair<int, int> PII;
const int N = 210;
int t, d[N][N], dx[]={0,1,0,-1}, dy[]={1,0,-1,0};
char g[N][N];
bool st[N][N];
queue<PII> q;
int main () {
cin >> t;
while (t --) {
int r, c, sx, sy;
cin >> r >> c;
for (int i = 0; i < r; i ++)
for (int j = 0; j < c; j ++) {
cin >> g[i][j];
if (g[i][j] == 'S') sx = i, sy = j;
}
bool flag = true;
memset(st, 0, sizeof st);
memset(d, 0, sizeof d);
q.push({sx, sy});
st[sx][sy] = true;
while (q.size()) {
auto t = q.front();
q.pop();
int x = t.first, y = t.second;
for (int i = 0; i < 4; i ++) {
int a = x + dx[i], b = y + dy[i];
if (a >= 0 && b >= 0 && a < r && b < c && !st[a][b] && g[x][y] != '#') {
st[a][b] = true;
d[a][b] = d[x][y] + 1;
if (g[a][b] == 'E') {
cout << d[a][b] << endl;
flag = false;
}
q.push({a, b});
}
}
}
if (flag) cout << "oop!" << endl;
}
return 0;
}