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类替换结构体;对于打印路径,因为每个节点的孩子只有一个双亲所以可以用孩子记录双亲依此找到最短路径坐标,对于非递归输出可用栈存储。

转载于:https://www.cnblogs.com/yzbpxx/p/10786057.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值