BFS走迷宫

第一篇先来写写关于广度优先搜索的东西,由于“涉世未深”,理解难免有偏差,还望指正。

/*
以下程序实现简单走迷宫
注意:
1.起始坐标为(1,1),终点坐标为(deep,bro);
2.0表示通畅,1表示不通;
3.没有考虑无法走出去的情况
*/
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
#define maxdeep 110  
#define maxbro 110   
int qu[maxdeep*maxbro];//运算队列
int dis[maxdeep][maxbro];//距离起点的距离
int pre[maxdeep*maxbro];//前驱结点
int map[maxdeep][maxbro];//地图存储
int deep,bro,stax,stay,desx,desy,le,ri;
int direx[4]={0,0,1,-1};//位置改变方案
int direy[4]={1,-1,0,0};
bool inbound(int xx,int yy)//判断是否在界内
{
    if((xx>=0&&xx<deep)&&(yy>=0&&yy<bro)) return true;
    return false;
}
void write(int s,int x)//递归方式输出路径
{
    if(s==x)//起点等于终点时结束
    {
        return;
    }
    else write(x,pre[x]);
    cout<<'('<<x/bro+1<<','<<x%bro+1<<')'<<endl;
}
void bfs(int sta,int des)//广搜代码
{
    memset(qu,0,sizeof(qu));
    memset(dis,-1,sizeof(dis));
    le=0;ri=0;
    qu[sta]=0;
    dis[sta/bro][sta%bro]=0;
    ri++;//队列向右延伸
    while(left<right)//队列不为空
    {
        int point=qu[le];
        le++;//出队列
        if(point==des) break;//找到最简方案
        int x=point/bro,y=point%bro;
        for(int i=0;i<4;i++)
        {
            int tx=x+direx[i];
            int ty=y+direy[i];//情况遍历
            if(!inbound(tx,ty)||map[tx][ty]==1)
                continue;
            if(dis[tx][ty]==-1)//当该节点没有走过且没有阻挡
            {
                dis[tx][ty]=dis[x][y]+1;//距离扩展
                pre[tx*bro+ty]=point;//记录前驱
                qu[ri]=tx*bro+ty;
                ri++;//加入队列
            }
        }
    }
    cout<<dis[des/bro][des%bro]<<endl;//输出终点最简方案,
    //保存的一定是最先到达的方案
    write(sta,des);//输出
}
int main()
{
    cin>>deep>>bro;//实际长宽
    stax=1;stay=1;//起点
    cin>>desx>>desy;//终点
    for(int i=0;i<deep;i++)
    {
        for(int j=0;j<bro;j++)
            cin>>map[i][j];
    }
    cout<<endl;
    stax--;
    stay--;
    desx--;
    desy--;
    bfs(stax*bro+stax,desy*bro+desy);
    return 0;
}

广搜的实现方法之一是由数组模拟的队列;队列里保存的是由上一种状态枚举所有可能策略之后的结果,所以能在相同步数之后同时比较多种策略,因为可以用于求解最短路径一类的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值