迷宫问题——bfs(输出最短路径)

定义一个二维数组:

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的步数为下标记录路径坐标,将记录坐标的数组放入结构体中,每次记录一个坐标,并让下一步的结构体继承上一步的坐标,则当走到终点时,到终点的结构体所记录的路径即为最短路径,下标为步数,从头到尾输出

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int M=110;
int mp[M][M];
int book[M][M];
int nx[4][2]={0,1,1,0,0,-1,-1,0};
struct node
{
    int x;
    int y;
    ///用步数当坐标的下标
    int step;
    ///记录每次走过的坐标
    int a[M];
    int b[M];
}qq[M];
int main()
{
    int i,j,k,l,m,n,s=0;
    node u,v,w;
    queue<node>q;
    memset(book,0,sizeof(book));
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
            cin>>mp[i][j];
    ///初始化
    u.x=0;u.y=0;u.step=0;
    ///起点坐标
    u.a[0]=0;
    u.b[0]=0;
    
    book[u.x][u.y]=1;
    q.push(u);
    while(!q.empty())
    {
        v=q.front();
        q.pop();
        if(v.x==4&&v.y==4)///找到终点
        {
            ///将到终点的这个结构体所存的路径输出
            for(i=0;i<=v.step;i++)
                cout<<"("<<v.a[i]<<", "<<v.b[i]<<")"<<endl;
            break;
        }
        ///继承这个结构体前面走过的坐标
        ///实质上就是记录上一步的坐标
        ///(到最后就把整个路径的坐标记录了下来)
        w=v;
        for(i=0;i<4;i++)
        {
            w.x=v.x+nx[i][0];
            w.y=v.y+nx[i][1];
            if(w.x>=0&&w.x<5&&w.y>=0&&w.y<5&&book[w.x][w.y]==0&&mp[w.x][w.y]!=1)
            {
                book[w.x][w.y]=1;
                w.step=v.step+1;
                ///步数加1的同时记录坐标
                w.a[w.step]=w.x;
                w.b[w.step]=w.y;
                q.push(w);
            }
        }
    }
    return 0;
}


版权声明:本文为mashizuren原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。