BFS走迷宫

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

/*
以下程序实现简单走迷宫
注意:
1.起始坐标为(1,1),终点坐标为(deep,bro);
2.0表示通畅,1表示不通;
3.没有考虑无法走出去的情况
*/
#include 
#include 
#include 
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=0&&yyreturn true;
    return false;
}
void write(int s,int x)//递归方式输出路径
{
    if(s==x)//起点等于终点时结束
    {
        return;
    }
    else write(x,pre[x]);
    cout<<'('<1<<','<1<<')'<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//队列不为空
    {
        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<//输出终点最简方案,
    //保存的一定是最先到达的方案
    write(sta,des);//输出
}
int main()
{
    cin>>deep>>bro;//实际长宽
    stax=1;stay=1;//起点
    cin>>desx>>desy;//终点
    for(int i=0;ifor(int j=0;jcin>>map[i][j];
    }
    cout<return 0;
}

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

你可能感兴趣的:(广度优先搜索)