0
点赞
收藏
分享

微信扫一扫

挑战程序设计——迷宫的最短路径

SDKB英文 2022-01-22 阅读 35
c++

给定一个大小为 N \times MN×M 的迷宫,由通道和墙壁组成。

每一步可以向相邻的上下左右四个方向移动。

请求出起点到终点的最小步数。本题保证从起点一定能走到终点。

# 表示墙壁,不可走。 . 表示通道,可走。S 表示起点。G 表示终点。

输入

  • 第一行两个整数 N, M(1 \leq N,M \leq 100)N,M(1≤N,M≤100)
  • 接下来 NN 行,每行 MM 个字符,表示迷宫

输出

  • 输出一行,表示从起点到终点的最少步数

样例 1

输入

10 10
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#

输出

#include<bits/stdc++.h>
using namespace std;

int N, M;
char ch[105][105];
int arr[105][105];
typedef pair<int,int> P;

int qx, qy, zx, zy;

int dx[4] = {0,0,-1,1};
int dy[4] = {-1, 1, 0, 0};

int bfs(){
    queue<P> que;
    for(int i = 0; i < N; i++){
        for(int j = 0; j < M; j++){
            arr[i][j] = 0x3f3f3f3f;
        }
    }
    que.push(P(qx, qy));
    arr[qx][qy] = 0;
    while(!que.empty()){
        P p = que.front();
        que.pop();
        if(p.first == zx && p.second == zy) break;

        for(int i = 0; i < 4; i++){
            int nx = p.first + dx[i], ny = p.second + dy[i];
            if(nx >= 0 && nx < N && ny >= 0 && ny < M && ch[nx][ny] != '#' && arr[nx][ny] == 0x3f3f3f3f){
                que.push(P(nx, ny));
                arr[nx][ny] = arr[p.first][p.second] + 1;
            }

        }
    }
    return arr[zx][zy];
}
int main(void){

    cin >> N  >> M;
    for(int i = 0; i < N; i++) cin >> ch[i];

    for(int i = 0; i < N; i++){
        for(int j = 0; j < M; j++){
            if(ch[i][j] == 'S'){
                qx = i;
                qy = j;
            }
            if(ch[i][j] == 'G'){
                zx = i;
                zy = j;
            }
        }
    }
    cout << bfs() << endl;
    return 0;
}
22
举报

相关推荐

0 条评论