广度优先搜索算法(英语:Breadth-First Search,缩写为BFS),又译作宽度优先搜索,或横向优先搜索,是一种图形搜索算法。
简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。广度优先搜索的实现一般采用open-closed表。
算法步骤:
1、首先将根节点放入队列中。
2、从队列中取出第一个节点,并检验它是否为目标。
如果找到目标,则结束搜寻并回传结果。
否则将它所有尚未检验过的直接子节点加入队列中。
3、若队列为空,表示整张图都检查过了——亦即图中没有欲搜寻的目标。结束搜寻并回传“找不到目标”。
4、重复步骤2。
原始代码如下
#include<iostream>
#include<queue>
#include<string.h>
#define maxn 105
using namespace std;
int n,m; //矩阵的大小
int sx,sy;
int vis[maxn][maxn],s[maxn][maxn],t[maxn][maxn];
queue<struct node>Q;
int px[]={1,-1,0,0}; //人可走的4个方向
int py[]={0,0,1,-1};
struct node{
int x,y,step;
}r,p,q;
int BFS()
{
//清空队列及初始化vis数组
while(!Q.empty())
Q.pop();
memset(vis,0,sizeof(vis));
p.x=sx;
p.y=sy;
p.step=0;
vis[p.x][p.y]=1;
Q.push(p);
while(!Q.empty())
{
p=Q.front();
Q.pop();
if(s[p.x][p.y]=='t')
return p.step;
for(int i=0;i<4;i++)
{
q=p;
q.x+=px[i];
q.y+=py[i];
q.step++;
if(q.x<0||q.y<0||q.x>=n||q.y>=m)
continue;
//访问未被访问过的位置,且此时是在火势蔓延到此前访问的,再将该位置入队
if(vis[q.x][q.y]==0&&q.step<t[q.x][q.y])
{
vis[q.x][q.y]=1;
Q.push(q);
}
}
}
return -1;
}
int main(){
//功能需求代码
//........
return 0;
}