简单迷宫最短路---c++、bfs

简单迷宫最短路—c++、bfs

1. 题目类型

    在一张简单的二维地图中,从已知起点到已知终点,求出最短的到达路线。

2.具体思路

    从起点出发,判断上下左右是否能走,将走过的路进行标记,直到终点,找出最短
    路。其中最主要的思想就是递归。

3. 关键步骤(代码)

(1)地图的存储及标记设计

   char maze[1000][1000];  // 地图,一般开一个较大的
     int  flag[1000][1000];  // 标记

(2)起始点的标记

 for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)//两个for循环遍历整张地图
        {
            cin>>maze[i][j];
            ///存储起点坐标(设s为起点)
            if(maze[i][j] == 's')
            {
                sx = i;
                sy = j;
            }
            ///存储终点坐标(设e为终点)
            if(maze[i][j] == 'e')
            {
                ex = i;
                ey = j;
            }
        }
    }

(3)判断是否能走

///判断x,y这个点能不能走,如能返回1,不能返回0
int can(int x,int y)
{
    if ( (x>=0&&x<n && y>=0 &&y<m ) /*是否在地图中*/ 
          &&  flag[x][y] == 0 /*是否为未走过的路*/
          &&  maze[x][y] != '1'/*是否为障碍*/)
    {
        return 1;
    }
    else
    {
        return 0;
    }

}

(4)格式的运用

 while(q.empty() != true)
    {
        node fr = q.front();
        q.pop();  ///取队首元素
        ///判断是否到终点
        if(fr.x == ex && fr.y == ey)
        {
            cout<<fr.step<<endl;
            return;  ///结束这个函数
        }
        int dx[] = {0,1,-1,0};
        int dy[] = {1,0,0,-1};//两个数组即为x,y的上下左右移动
        for(int i=0; i<4; i++)
        {
            ///     偏移量    上一个点的x
            int nx = dx[i] + fr.x;
            int ny = dy[i] + fr.y;
            if(can(nx,ny))//是否能走的判断
            {
                flag[nx][ny] = 1;        ///标记
                ///入队
                node tmp;
                tmp.x = nx;
                tmp.y  = ny;
                tmp.step = fr.step + 1;
                q.push(tmp);//运用队列
            }
        }
    }

(5)结束的判断

 if(fr.x == ex && fr.y == ey)
        {
            cout<<fr.step<<endl;
            return;  ///结束这个函数
        }

4.完整代码

#include <iostream>
#include <stack>
#include <queue>
using namespace std;
const int maxn = 1000+5;  //开的数组的规模,一般要比题目给的大
int n,m; ///地图的规模
int ex,ey; ///终点坐标

struct node
{
    int x,y;
    int step;
};

char maze[maxn][maxn];  // 地图
int  flag[maxn][maxn];  // 标记



///判断x,y这个点能不能走,如能返回1,不能返回0
int can(int x,int y)
{
    if ( (x>=0&&x<n && y>=0 &&y<m )  &&  flag[x][y] == 0 && 
    maze[x][y] != '1')
    {
        return 1;
    }
    else
    {
        return 0;
    }

}

void bfs(int sx,int sy)
{
    node top;
    top.x = sx;
    top.y = sy;
    top.step = 0;

    queue<node> q;
    q.push(top);

    while(q.empty() != true)
    {
        node fr = q.front();
        q.pop();  ///取队首元素
        ///判断是否到终点
        if(fr.x == ex && fr.y == ey)
        {
            cout<<fr.step<<endl;
            return;  ///结束这个函数
        }
        int dx[] = {0,1,-1,0};
        int dy[] = {1,0,0,-1};
        for(int i=0; i<4; i++)
        {
            ///     偏移量    上一个点的x
            int nx = dx[i] + fr.x;
            int ny = dy[i] + fr.y;
            if(can(nx,ny))
            {
                flag[nx][ny] = 1;        ///标记
                ///入队
                node tmp;
                tmp.x = nx;
                tmp.y  = ny;
                tmp.step = fr.step + 1;
                q.push(tmp);
            }
        }
    }
    cout<<"走不到"<<endl;
}

int main()
{

    int sx,sy;
    cin>>n>>m;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            cin>>maze[i][j];
            ///存储起点坐标
            if(maze[i][j] == 's')
            {
                sx = i;
                sy = j;
            }
            ///存储终点坐标
            if(maze[i][j] == 'e')
            {
                ex = i;
                ey = j;
            }
        }
    }
    bfs(sx,sy);
    return 0;
}
发布了1 篇原创文章 · 获赞 0 · 访问量 8
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览