【BFS+保存路径】POJ 3984 迷宫问题

Problem Description

给你一个5*5的二维数组,表示一个迷宫,0可以走,1不可以走,问你从左上角到右下角,最短的路径,保证数据有唯一的解。

代码:BFS从左上角跑到右下角就好了,没跑到一个点记录,是那个点到的这个点。后面翻转下路径输出就可以了

#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
struct node
{
    int ii, jj;
};
int Map[10][10], vis[10][10];//迷宫,标记数组
node Pre[10][10];//记录路径
queue<node> q;
vector<node> a;//记录结果路径用的
int x[5] = {1, 0, -1, 0};
int y[5] = {0, 1, 0, -1};
int judge(int xx, int yy)
{
    if(xx >= 0 && yy >= 0 && xx < 5 && yy < 5 && !vis[xx][yy] && Map[xx][yy] == 0) return 1;
    else return 0;
}
void Bfs(int u, int v)
{
    int i;
    memset(vis, 0, sizeof(vis));
    while(!q.empty()) q.pop();//初始化队列
    q.push((node){u, v});//入队列最开始0,0点
    vis[u][v] = 1;//标记一下已经走过&&记录路径
    node t;
    int xx, yy;
    while(!q.empty())
    {
        t = q.front();
        q.pop();
        if(t.ii == 4 && t.jj == 4)//到达终点
        {
            a.push_back((node){t.ii, t.jj});//记录路径
            while(t.ii || t.jj)//直到起点退出循环
            {
                xx = t.ii, yy = t.jj;
                a.push_back((node){Pre[xx][yy].ii, Pre[xx][yy].jj});//存入上一点
                t.ii = Pre[xx][yy].ii; t.jj = Pre[xx][yy].jj;
            }
            for(i = a.size() - 1; i >= 0; i--)//反向输出
            {
                printf("(%d, %d)\n", a[i].ii, a[i].jj);
            }
            return ;

        }
        for(i = 0; i < 4; i++)//上下左右的走
        {
            xx = t.ii + x[i];
            yy = t.jj + y[i];
            if(judge(xx, yy))//判断下一步可以走
            {
                vis[xx][yy] = vis[t.ii][t.jj] + 1;//路径++
                Pre[xx][yy] = (node){t.ii, t.jj};//记录好那一点到的这一点
                q.push((node){xx, yy});//入队列
            }
        }
    }
}
int main()
{
    int i, j;
    for(i = 0; i < 5; i++)
    {
        for(j = 0; j < 5; j++)
            scanf("%d", &Map[i][j]);
    }
    Bfs(0, 0);//最开始0,0点
    a.clear();
    return 0;
}
    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/bbbbswbq/article/details/72518016
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞