bfs的框架及示例
bfs的框架
bfs的示例
题目
在一个长度是n的坐标轴上,从A点移动到B点,3个移动规则如下:
1.向前一步,坐标加1;
2.向后一步,坐标减1;
3.跳跃一步,坐标乘2;
不同移动到坐标小于0,或大于n的位置。求从A点到达B点的最少步数是多少?
输入:
输入3个整数,分别代表n、A、B。()0<=A, B<=n<=50000)
输出:
输出1个整数,代表最少的步数。
代码如下:
#include<iostream>
#include<queue>
using namespace std;
struct leap { //声明结构体,将下标与步数相连起来
int index,step;
leap(int _index,int _step){ //构造结构体
index = _index;
step = _step;
}
};
queue<leap> q; //实例化队列q
bool vis[5005]; //记录是否已访问
void bfs(int n,int A,int B){ //bfs
q. push(leap(A,0)); //起始点插入队列
vis[A]=true; //标记起始点已访问
while(!q.empty()){ //队列不为空
int index = q.front().index;
int step = q.front().step;
q.pop(); //删除头元素
//遍历该节点下的所有可能,并将所有可能加到队尾
if(index==B){ //到达B
cout<<step<<endl;
return ; //不需要等到全部遍历完,只要找到最短路径即可
}
if(index+1<=n && !vis[index+1]){ //往前一步
q.push(leap(index+1,step+1));
vis[index+1]=true; //标记已访问
}
if(index-1>=0 && !vis[index-1]){ //往后一步
q.push(leap(index-1,step+1));
vis[index-1]=true;
}
if(index*2<=n && !vis[index*2]){ //跳跃一步
q.push(leap(index*2,step+1));
vis[index*2]=true;
}
}
}
int main(){
int n,A,B;
cin>>n>>A>>B;
bfs(n,A,B);
return 0;
}
dfs与bfs的适用范围
dfs:深度优先搜索——可以满足所有条件的总数
bfs:广度优先搜索——状态的转移,求层数最少、路径最短
其实,在遍历过程中,dfs、bfs都是可以使用的,都可以求得到答案,只是在这两种情况下,其中,某种方法更简单、合适。