• BFS入门


    #include<iostream>
    #include<cstring>
    #include<queue>
    using namespace std;
    #define MAX 100
    #define INF 0x3f3f3f3f
    typedef pair<int ,int> P;
    int sx,sy,gx,gy,n,m;
    char maze[MAX][MAX];
    int d[MAX][MAX];
    int diraction[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
    P ser[MAX][MAX];
    int bfs()
    {
        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]=='G')
                {
                    gx=i;
                    gy=j;
                }
            }
        queue<P> que;
        que.push(P(sx,sy));
        memset(d,INF,sizeof(d));
        d[sx][sy]=0;
        while(que.size())
        {
            P p=que.front();
            que.pop();
            int x=p.first,y=p.second;
            if(x==gx&&y==gy) break;
            for(int i=0;i<4;i++)
            {
                int cx=x+diraction[i][0],cy=y+diraction[i][1];
                if(cx>=0&&cx<n&cy>=0&&cy<m&&d[cx][cy]==INF&&maze[cx][cy]!='#')
                {
                    que.push(P(cx,cy));
                    d[cx][cy]=d[x][y]+1;
                    ser[cx][cy].first=x;
                    ser[cx][cy].second=y;
                }
            }
        }
        return d[gx][gy];
    }
    void print(int x,int y)
    {
        if(x==sx&&y==sy)
        {
            cout<<'('<<sx<<','<<sy<<')'<<endl;
            return ;
        }
        print(ser[x][y].first,ser[x][y].second);
        cout<<'('<<x<<','<<y<<')'<<endl;
        return ;
    }
    int main ()
    {
        cout<<bfs()<<endl;
        print(gx,gy);
        return 0;
    }

    样例:

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

    输出
    22(附加坐标)

    解析  : 广度优先搜索对树的每一层一次遍历,即筛选最短路径,用队列存储找到的元素(相对于深度优先搜索使用栈),其中可用pair类替换结构体;对于打印路径,因为每个节点的孩子只有一个双亲所以可以用孩子记录双亲依此找到最短路径坐标,对于非递归输出可用栈存储。

  • 相关阅读:
    Python自动化开发-基础语法
    Python自动化开发-简介
    Hello World!
    Mongo导出数据文件导致错误 Got signal: 6 (Aborted)解决方法
    PHP快速排序及其时间复杂度
    PHP读某一个目录下所有文件和文件夹
    PHP获得两个绝对路径的相对路径
    awk神器
    PHP使用Mysql事务
    PHP使用session_set_save_handler陷阱
  • 原文地址:https://www.cnblogs.com/yzbpxx/p/10786057.html
Copyright © 2020-2023  润新知