• AcWing 1112. 迷宫


    \(AcWing\) \(1112\). 迷宫

    题目传送门

    一、题目大意

    一天\(Extense\)在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由 \(n∗n\) 的格点组成,每个格点只有\(2\)种状态,.#,前者表示 可以通行 后者表示 不能通行

    同时当\(Extense\)处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,\(Extense\)想要从点\(A\)走到点\(B\),问在不走出迷宫的情况下能不能办到。

    如果起点或者终点有一个不能通行(为#),则看成无法办到。

    注意\(A、B\)不一定是两个不同的点。

    二、\(dfs\)+\(void\)返回值 【推荐】

    #include <bits/stdc++.h>
    
    using namespace std;
    const int INF = 0x3f3f3f3f;
    // dfs只能求出来是否连通,第一次搜索到时并不能保证是最短距离
    // bfs也可以做,可以保证第一次到达时是最短距离
    // dfs好处是代码短,按时间排名,那么先AC的同学排名靠前
    // 用标记数组进行标记,每个位置只使用一次,性能N*N
    const int N = 110;
    int n;
    char g[N][N]; //地图
    int xa, ya, xb, yb;
    int dx[] = {-1, 0, 1, 0};
    int dy[] = {0, 1, 0, -1};
    bool st[N][N]; //是否走过
    bool flag;
    
    void dfs(int x, int y) {
        if (x == xb && y == yb) {
            flag = true;
            return;
        }
        for (int i = 0; i < 4; i++) {
            int a = x + dx[i], b = y + dy[i];
            if (a < 0 || a == n || b < 0 || b == n) continue;
            if (st[a][b]) continue;
            if (g[a][b] == '#') continue;
            st[a][b] = true;
            dfs(a, b);
        }
    }
    
    int main() {
        int T;
        cin >> T;
        while (T--) {
            cin >> n;
            for (int i = 0; i < n; i++) cin >> g[i];
            cin >> xa >> ya >> xb >> yb;
            //多组测试数组,每次初始化0
            memset(st, 0, sizeof st);
            flag = false;
    
            if (g[xa][ya] == '#' || g[xb][yb] == '#') {
                puts("NO");
                continue;
            }
    
            st[xa][ya] = true;
            dfs(xa, ya);
    
            if (flag)
                puts("YES");
            else
                puts("NO");
        }
    
        return 0;
    }
    
    

    三、\(dfs\)+\(void\)+\(change\)

    #include <bits/stdc++.h>
    
    using namespace std;
    const int INF = 0x3f3f3f3f;
    // dfs只能求出来是否连通,第一次搜索到时并不能保证是最短距离
    // bfs也可以做,可以保证第一次到达时是最短距离
    // dfs好处是代码短,按时间排名,那么先AC的同学排名靠前
    // 用标记数组进行标记,每个位置只使用一次,性能N*N
    const int N = 110;
    int n;
    char g[N][N]; //地图
    int xa, ya, xb, yb;
    int dx[] = {-1, 0, 1, 0};
    int dy[] = {0, 1, 0, -1};
    bool flag;
    
    void dfs(int x, int y) {
        //如果目标位置是#的话,也是不可以到达的,这句话的优先级高,需要写在上面
        if (x == xb && y == yb) {
            flag = true;
            return;
        }
        for (int i = 0; i < 4; i++) {
            int a = x + dx[i], b = y + dy[i];
            if (a < 0 || a >= n || b < 0 || b >= n) continue;
            if (g[a][b] == '#') continue;
            g[a][b] = '#';
            dfs(a, b);
        }
    }
    
    int main() {
        int T;
        cin >> T;
        while (T--) {
            cin >> n;
            for (int i = 0; i < n; i++) cin >> g[i];
            cin >> xa >> ya >> xb >> yb;
            flag = false;
    
            if (g[xa][ya] == '#' || g[xb][yb] == '#') {
                puts("NO");
                continue;
            }
    
            g[xa][ya] = '#';
            dfs(xa, ya);
    
            if (flag)
                puts("YES");
            else
                puts("NO");
        }
    
        return 0;
    }
    
    

    四、\(dfs\)+\(bool\)返回值

    #include <bits/stdc++.h>
    
    using namespace std;
    const int INF = 0x3f3f3f3f;
    // dfs只能求出来是否连通,第一次搜索到时并不能保证是最短距离
    // bfs也可以做,可以保证第一次到达时是最短距离
    // dfs好处是代码短,按时间排名,那么先AC的同学排名靠前
    // 用标记数组进行标记,每个位置只使用一次,性能N*N
    const int N = 110;
    int n;
    char g[N][N]; //地图
    int xa, ya, xb, yb;
    int dx[] = {-1, 0, 1, 0};
    int dy[] = {0, 1, 0, -1};
    bool st[N][N]; //是否走过
    bool flag;
    
    void dfs(int x, int y) {
        if (x == xb && y == yb) {
            flag = true;
            return;
        }
        for (int i = 0; i < 4; i++) {
            int a = x + dx[i], b = y + dy[i];
            if (a < 0 || a == n || b < 0 || b == n) continue;
            if (st[a][b]) continue;
            if (g[a][b] == '#') continue;
            st[a][b] = true;
            dfs(a, b);
        }
    }
    
    int main() {
        int T;
        cin >> T;
        while (T--) {
            cin >> n;
            for (int i = 0; i < n; i++) cin >> g[i];
            cin >> xa >> ya >> xb >> yb;
            //多组测试数组,每次初始化0
            memset(st, 0, sizeof st);
            flag = false;
    
            if (g[xa][ya] == '#' || g[xb][yb] == '#') {
                puts("NO");
                continue;
            }
    
            st[xa][ya] = true;
            dfs(xa, ya);
    
            if (flag)
                puts("YES");
            else
                puts("NO");
        }
    
        return 0;
    }
    
    

    五、\(bfs\)+\(bool\)返回值

    #include <bits/stdc++.h>
    using namespace std;
    struct Node {
        int x;
        int y;
        int step;
    };
    const int N = 110;
    int dx[] = {-1, 0, 1, 0};
    int dy[] = {0, 1, 0, -1};
    char g[N][N];
    bool st[N][N];
    int n;
    int xa, ya, xb, yb; //不能使用x1,y1这样的变量名,可能是万能头中有重复声明
    
    bool bfs() {
        if (g[xa][ya] == '#') return false;
        if (g[xb][yb] == '#') return false;
    
        memset(st, 0, sizeof st);
    
        if (xa == xb && ya == yb) return true;
    
        queue<Node> q;
        q.push({xa, ya, 0});
        st[xa][ya] = true;
    
        while (q.size()) {
            auto 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 >= n || y < 0 || y >= n) continue;
                if (st[x][y]) continue;
                if (g[x][y] == '#') continue;
                if (x == xb && y == yb) {
                    //输出步数
                    // cout << t.step << endl;
                    return true;
                }
                q.push({x, y, t.step + 1});
                st[x][y] = true;
            }
        }
        return false;
    }
    int main() {
        int T;
        cin >> T;
        while (T--) {
            cin >> n;
            for (int i = 0; i < n; i++) cin >> g[i];
    
            cin >> xa >> ya >> xb >> yb;
            if (bfs())
                cout << "YES" << endl;
            else
                cout << "NO" << endl;
        }
        return 0;
    }
    
    
  • 相关阅读:
    测试心得
    mysql学习整理
    测试思考
    Win7下安装Mysql方法
    xcall.sh
    hive 的几款可视化连接工具
    mongo 使用 mongoexport 按照条件导出 csv 文件
    WebFlux springboot 2.0
    Calendar java  日历(常用小结)
    java 自定义注解(3)
  • 原文地址:https://www.cnblogs.com/littlehb/p/15974957.html
Copyright © 2020-2023  润新知