AcWing 1101. 獻給阿爾吉儂的花束 《信息學奧賽一本通》

1.問題

阿爾吉儂是一隻聰明又慵懶的小白鼠,它最擅長的就是走各類各樣的迷宮。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!

2.思路

AC 1101.png

3.代碼

#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;
}
相關文章
相關標籤/搜索