第一篇先来写写关于广度优先搜索的东西,由于“涉世未深”,理解难免有偏差,还望指正。
/*
以下程序实现简单走迷宫
注意:
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;
}
广搜的实现方法之一是由数组模拟的队列;队列里保存的是由上一种状态枚举所有可能策略之后的结果,所以能在相同步数之后同时比较多种策略,因为可以用于求解最短路径一类的问题