zoukankan      html  css  js  c++  java
  • (BFS 输出路径 pair)

    迷宫问题
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 41913   Accepted: 23240

    Description

    定义一个二维数组: 

    int maze[5][5] = {
    0, 1, 0, 0, 0,
    0, 1, 0, 1, 0,
    0, 0, 0, 0, 0,
    0, 1, 1, 1, 0,
    0, 0, 0, 1, 0,
    };

    它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

    Input

    一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

    Output

    左上角到右下角的最短路径,格式如样例所示。

    Sample Input

    0 1 0 0 0
    0 1 0 1 0
    0 0 0 0 0
    0 1 1 1 0
    0 0 0 1 0

    Sample Output

    (0, 0)
    (1, 0)
    (2, 0)
    (2, 1)
    (2, 2)
    (2, 3)
    (2, 4)
    (3, 4)
    (4, 4)

    这个题BFS模板题,不过,关键点也就是难点在与如何输出最短路。
    看这个大佬的博客:
    https://blog.csdn.net/qq_33279781/article/details/51991835
    这个可以用栈保存前驱。
    C++代码:
    #include<iostream>
    #include<queue>
    #include<stack>
    #include<stdio.h>
    #include<cstring>
    using namespace std;
    typedef pair<int, int> pii;
    
    int arr[5][5];
    bool vis[5][5];
    int dx[] = { 0,0,1,-1 };
    int dy[] = { 1,-1,0,0 };
    
    pii pre[6][6];
    
    void print() {
        stack<pii> s;
        pii n(4,4);  //注意扎实基础。 
        while (1) {
            s.push(n);
            if (n.first == 0 && n.second == 0)
                break;
            n = pre[n.first][n.second]; //更新n为n的前驱。
        }
        while (!s.empty()) {
            cout << "(" << s.top().first << ", " << s.top().second << ")" << endl;  //审题,注意格式。
            s.pop();
        }
    }
    
    void bfs(int i, int j) {
        queue<pii> q;
        q.push(pii(i,j));
        vis[i][j] = true;
        while (!q.empty()) {
            pii tmp = q.front();
            q.pop();
            if (tmp.first == 4 && tmp.second == 4) {
                print();
                return;
            }
            for (int i = 0; i < 4; i++) {
                int x = tmp.first + dx[i];
                int y = tmp.second + dy[i];
                if (x >= 0 && x < 5 && y >= 0 && y < 5 && !vis[x][y] && arr[x][y] == 0) {
                    q.push(pii(x,y));
                    vis[x][y] = true;
                    pre[x][y] = tmp;  //保存前驱。
                }
            }
        }
    }
    int main() {
        memset(arr, 0, sizeof(arr));
        memset(vis, false, sizeof(vis));
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++)
                cin >> arr[i][j];
        }
        bfs(0, 0);
        return 0;
    }
    
    

    pair的用法如图:

     
     
  • 相关阅读:
    30天敏捷结果(2):用三个故事驱动你的一周
    30天敏捷结果(24):恢复你的精力
    30天敏捷结果(6):周五回顾,找到三件做的好以及三件需要改善的事情
    js 数组循环和迭代
    没有+求和
    js检测数组类型
    redis 在windows 下的安装和使用
    版本控制(一)——初步概念
    苹果树的故事(转发的)
    mongoDB之在windows下的安装
  • 原文地址:https://www.cnblogs.com/Weixu-Liu/p/10868838.html
Copyright © 2011-2022 走看看