侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 675 篇文章
  • 累计创建 128 个标签
  • 累计收到 29 条评论

目 录CONTENT

文章目录

【BFS】献给阿尔吉侬的花束

GabrielxD
2022-12-20 / 0 评论 / 0 点赞 / 206 阅读 / 780 字
温馨提示:
本文最后更新于 2022-12-20,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

1101. 献给阿尔吉侬的花束


阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫。

今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪。

现在研究员们想知道,如果阿尔吉侬足够聪明,它最少需要多少时间就能吃到奶酪。

迷宫用一个 R×CR×C 的字符矩阵来表示。

字符 S 表示阿尔吉侬所在的位置,字符 E 表示奶酪所在的位置,字符 # 表示墙壁,字符 . 表示可以通行。

阿尔吉侬在 1 个单位时间内可以从当前的位置走到它上下左右四个方向上的任意一个位置,但不能走出地图边界。

输入格式

第一行是一个正整数 TT ,表示一共有 TT 组数据。

每一组数据的第一行包含了两个用空格分开的正整数 RRCC ,表示地图是一个 R×CR×C 的矩阵。

接下来的 RR 行描述了地图的具体内容,每一行包含了 CC 个字符。字符含义如题目描述中所述。保证有且仅有一个 S 和 E。

输出格式

对于每一组数据,输出阿尔吉侬吃到奶酪的最少单位时间。

若阿尔吉侬无法吃到奶酪,则输出“oop!”(只输出引号里面的内容,不输出引号)。

每组数据的输出结果占一行。

数据范围

1<T101 \lt T \le 10 ,
2R,C2002 \le R,C \le 200

输入样例:

3
3 4
.S..
###.
..E.
3 4
.S..
.E..
....
3 4
.S..
####
..E.

输出样例:

5
1
oop!

解题

方法一:BFS

思路

迷宫问题,同【BFS】仙岛求药,直接宽搜

代码

#include <iostream>
#include <limits>
#include <queue>

using namespace std;

typedef pair<int, int> PII;

const int N = 310, DIRS[][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int t, n, m;
bool g[N][N];
int sx, sy, ex, ey;

int bfs() {
    queue<PII> que;
    que.push({sx, sy});
    g[sx][sy] = false;
    int step = 0;
    while (!que.empty()) {
        int sz = que.size();
        while (sz--) {
            auto curr = que.front();
            que.pop();
            int x = curr.first, y = curr.second;
            if (x == ex && y == ey) return step;
            for (auto& DIR : DIRS) {
                int nx = x + DIR[0], ny = y + DIR[1];
                if (nx >= 0 && nx < n && ny >= 0 && ny < m && g[nx][ny]) {
                    que.push({nx, ny}); 
                    g[nx][ny] = false;
                }
            }
        }
        ++step;
    }
    return -1;
}

int main() {
    scanf("%d", &t);
    while (t--) {
        scanf("%d%d", &n, &m);
        for (int i = 0; i < n; ++i) {
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            for (int j = 0; j < m; ++j) {
                char c;
                scanf("%c", &c);
                if (c == 'S') sx = i, sy = j;
                else if (c == 'E') ex = i, ey = j;
                g[i][j] = c != '#';
            }
        }
        int ans = bfs();
        if (!~ans) puts("oop!");
        else printf("%d\n", ans);
    }
    
    return 0;
}
0

评论区