ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NC15136 迷宫

2022-07-16 18:32:08  阅读:128  来源: 互联网

标签:cur int 迷宫 st yy xx 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;
}

标签:cur,int,迷宫,st,yy,xx,NC15136
来源: https://www.cnblogs.com/BlankYang/p/16484864.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有