广度优先搜素:
广度优先搜素并不像深度优先搜素那样一个节点遍历到底,而是一层一层的遍历,
不同与深搜,该算法使用了队列。
广度优先算法:
例题:
代码:
/*农夫找牛*/
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int N,K;//N为农夫的位置,K为牛的位置
const int MAXN=100000;
int visited[MAXN+10];//判重标记,visited[i]=true 表示i已经拓展过
//表示一个坐标
struct Step{
int x;//位置
int steps;//到达所需要的步数
Step(int xx,int s):x(xx),steps(s){}//参数初始化
};
queue<Step>q;//队列,即OPEN表
int main(){
cin>>N>>K;
memset(visited,0,sizeof(visited));//初始化,表示都没走过
q.push(Step(N,0));//农夫的起始位置
visited[N]=1;
while(!q.empty()) {
Step s = q.front();//取出头结点
if(s.x==K) //如果找到目标
{
cout<<s.steps<<endl;
return 0;
}
else
{
if(s.x-1>=0&&!visited[s.x-1])//该点可以移动,且没有走过
{
q.push(Step(s.x-1,s.steps+1));//压入队列,且步数+1
visited[s.x-1]=1;
}
if(s.x+1>=0&&!visited[s.x+1])
{
q.push(Step(s.x+1,s.steps+1));//压入队列,且步数+1
visited[s.x+1]=1;
}
if(s.x*2>=0&&!visited[s.x*2])
{
q.push(Step(s.x*2,s.steps*2));//压入队列,且步数+1
visited[s.x*2]=1;
}
q.pop();//如果相邻结点都遍历完了或没有相邻结点,就出队
}
}
return 0;
}