我一直想写一篇广度优先搜索的文章来自己梳理一下,大概是我用广度用的少,我觉得对他不熟悉。
广度就是先看面前了 就是一群妹子站成N队 看完一队再看一队那是深搜 ,先看把这N队的第一个看完,再看第二个这样一次类推 就是广搜了。。。
一般广搜就是搜索最近的了 最短的了 这些东西 ;
废话不多说上菜:
广度优先搜索一般与图有关 就是给你一个图 例如:
A***#B
**###*
#*****
让你找一条A道B最短的路径 其中*能走 #不能走;
就是上来先输入图 一般存储在char[][]中;
char m[MAX_N][MAX_N];
图吗 找的就是坐标 所以我们这里用c++的 pair<int,int> 。
typedef pair<int,int> P;
还有要准备的就是两个数组,用来处理将来 当前位置 要向四个方向前进,
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
下面我们来写bfs函数:
在处理时我们用的是队列,c语言可以用数组来处理,不过处理起来不如队列省事;
void bfs()
{
queue<int> que;
//先找到初始位置坐标 si,sy;
d[si][sy]=0;//d数组是用来存储当前位置到初始位置的最短距离
//现将初始位置入队
que.push(P(si,sy));
while(!que.empty())
{
P p=que.front();
que.pop();
if(p.first==ei&&p.second==ej) break;//ei,ej是终点;
for(int i=0;i<4;i++)
{
int nx=p.first+dx[i];
int ny=p.second+dy[i];
if(nx>=0&&nx<n&&ny>=0&&ny<n&&m[nx][ny]!='#'&&d[nx][ny]==INF)//判断是否越界 并且可行 并且没有走过
{
que.push(P(nx,ny));
d[nx][ny]=d[p.first][p.second]+1;
}
}
}
}
这就是最简单的广度优先搜索的题目,这是我从算法书上看来的;
感谢自己,又写一篇,感谢看到错误 一起改正;