NC15136 迷宫

题目链接

题目

题目描述

这是一个关于二维迷宫的题目。我们要从迷宫的起点 'S' 走到终点 'E',每一步我们只能选择上下左右四个方向中的一个前进一格。 'W' 代表墙壁,是不能进入的位置,除了墙壁以外的地方都可以走。迷宫内的 'D' 代表一道上锁的门,只有在持有钥匙的时候才能进入。而 'K' 则代表了钥匙,只要进入这一格,就会自动地拿到钥匙。最后 '.' 则是代表空无一物的地方,欢迎自在的游荡。

本题的迷宫中,起点、终点、门跟钥匙这四个特殊物件,每一个恰好会出现一次。而且,此迷宫的四周 (最上面的一行、最下面的一行、最左边的一列以及最右边的一列) 都会是墙壁。

请问,从起点到终点,最少要走几步呢?

输入描述

输入的第一行有两个正整数H, W,分别代表迷宫的长跟宽。
接下来的H行代表迷宫,每行有一个长度恰为W的字串,此字串只包含'S', 'E', 'W', 'D ', 'K', '.'这几种字元。

输出描述

请在一行中输出一个整数代表答案,如果无法从起点走到终点,请输出-1。

示例1

输入

4 12
WWWWWWWWWWWW
WE.W.S..W.KW
W..D..W....W
WWWWWWWWWWWW

输出

20

示例2

输入

6 6
WWWWWW
WEWS.W
W.WK.W
W.WD.W
W.W..W
WWWWWW

输出

-1

备注

4 ≤ H, W≤ 500
'S', 'E', 'K', 'D'各出现恰好一次
迷宫的四周(最上面的一行、最下面的一行、最左边的一列以及最右边的一列) 都会是 'W'

题解

知识点:BFS。

显然用bfs,不过状态是高维的,包括 (x坐标,y坐标,是否有钥匙) 三个独立状态,互相不能排除。

细节上注意有钥匙能开门。

关于步数也可以放进 node 里没关系的。

时间复杂度 \(O(?)\)

空间复杂度 \(O(mn)\)

代码

#include <bits/stdc++.h>

using namespace std;

char dt[507][507];
bool vis[507][507][2];
int step[507][507][2];
const int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
struct node {
    int x, y;
    bool k;
};

int bfs(node st) {
    queue<node> q;
    q.push(st);
    vis[st.x][st.y][0] = 1;
    step[st.x][st.y][0] = 0;
    while (!q.empty()) {
        node cur = q.front();
        q.pop();
        if (dt[cur.x][cur.y] == 'E') return step[cur.x][cur.y][cur.k];
        for (int i = 0;i < 4;i++) {
            int xx = cur.x + dir[i][0];
            int yy = cur.y + dir[i][1];
            if (dt[xx][yy] == 'W') continue;
            bool kk = cur.k || dt[xx][yy] == 'K';
            if (vis[xx][yy][kk] || dt[xx][yy] == 'D' && !kk) continue;
            q.push({ xx,yy,kk });
            vis[xx][yy][kk] = 1;
            step[xx][yy][kk] = step[cur.x][cur.y][cur.k] + 1;
        }
    }
    return -1;
}

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int h, w;
    cin >> h >> w;
    node st;
    for (int i = 0;i < h;i++) {
        for (int j = 0;j < w;j++) {
            cin >> dt[i][j];
            if (dt[i][j] == 'S') st.x = i, st.y = j, st.k = 0;
        }
    }
    cout << bfs(st) << '\n';
    return 0;
}
posted @ 2022-07-16 18:21  空白菌  阅读(38)  评论(0编辑  收藏  举报