迷宫的最短路径

给定一个大小为NxM的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动。请求出从起点到终点所需的最小步数。请注意,本题假定从起点一定可以移动到终点。

!限制条件:
• N,M≤100

样例
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
N=10,M=10(迷宫如下图表示。(‘#’,‘.’,’S’,’G’分别表示墙壁、通道、起点和终点)

S######.#
……#..#
.#.##.##.#
.#…….
##.##.####
….#….#
.#######.#
….#…..
.####.###.
….#…G#

 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
代码

#include<cstdio>
#include<queue>

using namespace std;  
const int MAX_N = 100, MAX_M = 100;

const int INF = 100000000;

typedef pair<int, int> P;
//输入
char maze[MAX_N][MAX_M + 1];//表示迷宫的字符串数组
int N, M;
int sx, sy;//坐标起点
int gx, gy;//坐标终点

int d[MAX_N][MAX_M];//到各个位置的距离最短的数组

//4个方向移动的向量
int dx[4] = {1,0,-1,0}, dy[4] = {0,1,0,-1};

//求从(sx,sy)到(gx,gy)的最短距离
//如果无法到达,则是INF
int bfs();
void solve();

int main()
{
    scanf_s("%d %d",&N,&M);
    fflush(stdin);
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M + 1;j++)//多出的1表示存储<Enter>
        {
            maze[i][j] = getchar();
        }
    }
    solve();
    while (1);
    return 0;

}

int bfs()
{
    queue<P> que;
    //把所有位置的距离都初始化为INF
    for (int i = 0; i < MAX_N; i++)
    {
        for (int j = 0; j < MAX_M; j++) 
        {
            d[i][j] = INF;
        }

    }
    //找到起点和终点
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M;j++)
        {
            if (maze[i][j] == 'S')
            {
                sx = i;
                sy = j;
            }
            if (maze[i][j]=='G')
            {
                gx = i;
                gy = j;
            }

        }
    }
    //将起点加入到队列,并把这一地点的距离设置为0
    que.push(P(sx, sy));
    d[sx][sy] = 0;

    //不断循环直到队列的长度为0
    while (que.size())
    {
        //从队列中取出最前端的元素
        P p = que.front();
        que.pop();
        //如果取出来的状态已经是终点,则结束搜索
        if (p.first==gx&&p.second==gy)
            break;
        //四个方向的循环
        for (int i = 0; i < 4;i++)
            //移动之后的距离记为(nx,ny)
        {
            int nx = p.first + dx[i];
            int ny = p.second + dy[i];
            if (0<=nx&&nx<N&&0<=ny&&ny<M&&maze[nx][ny]!='#'&&d[nx][ny]==INF)
            {
                que.push(P(nx,ny));
                d[nx][ny] = d[p.first][p.second] + 1;
            }
        }
    }

    return d[gx][gy];
}

void solve()
{
    int res = bfs();
    printf("%d\n",res);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值