【ACM】算法题-迷宫的最短路径 (宽度搜索)(C++)(数据结构)(图论)

迷宫的最短路径

题目

给定一个大小为n*m的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动。请求出起点到终点所需的最小步数。(注:本题假定从起点一定可以移动到终点)如图:
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
求S->G的最短路径
输入

第一行是N 【2,,200】M【2,200】

输出

出口S到G的最短路径

样例输入
10 10
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
样例输出
22

思路小导

本题采用搜索的方法,在这里求最短路径能用且只能用宽度也就是广度搜索才有优势解决,对原有的宽度搜索的套路进行改良,首先在输入二维数组的地图迷宫后,要标记起始位置,在图里也就是S与G的位置标记好后,作为宽搜里的参数代入,在宽搜里面,我们也可以吧pair替换成结构体Node(Node内有参数x,y,z分别代表横纵坐标和下一步),其余步骤与上一题宽搜一样,不过把Node替换好,在push和pop的细节上处理好就行。

代码流程

#include

using namespace std;
#define endl '\n'
using ll=long long;
const size_t maxn = 101;
char a[maxn][maxn], book[maxn][maxn];
int m, n;
int fx[4][2] = {{0,  1},
                {0,  -1},
                {1,  0},
                {-1, 0}};

struct Node {//代替之前的pair
    int x, y, z;

};

int bfs(int sx, int sy, int ex, int ey) {
    int ans = 0;
    queue Q;
    Q.push({sx, sy, 0});
    while (Q.size()) {
        auto &pt = Q.front();
        int x = pt.x;
        int y = pt.y;
        int z = pt.z;
        if (x == ex && y == ey) {
            cout << z << endl;
            return 0;
        }
        ++ans;
        for (int i = 0; i < 4; i++) {
            int nx = x + fx[i][0];
            int ny = y + fx[i][1];
            if (nx < 0 || nx >= m || ny >= n || book[nx][ny] || a[nx][ny] == '#')continue;
            Q.push({nx, ny, z + 1});
            book[nx][ny] = 1;
        }
        Q.pop();
    }
    cout << -1 << endl;
    return ans;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin >> m >> n;
    int sx, sy, ex, ey;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            cin >> a[i][j];
            book[i][j] = 0;
            if (a[i][j] == 'S') { sx = i, sy = j; }//
            if (a[i][j] == 'G') { ex = i, ey = j; }//标记好起始位置
        }
    }
    bfs(sx, sy, ex, ey);//直接调用搜索函数输出最短路径
    return 0;
}

小结

强化宽度搜索(广度搜索)的具体代码套路
理清要求,不断测试,具体完整实现

你可能感兴趣的:(算法,bfs,算法,数据结构,c++,程序设计)