POJ_4001,一维BFS算法,通过队列实现而不递归,每次标记临近的点,标记后均为最短距离(即值一旦被修改就是最优值),常用于解决最短路径问题(如迷宫)
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int minutes[100001];
queue <int> q;
int bfs(int x,int y){
while(!q.empty()){
//获取当前点“临近”的点后,将该点移除队列
int curr=q.front();
q.pop();
//终止条件
if(curr==y) return minutes[curr];
//选择“临近”点
int choose[3];
choose[0]=curr*2;
choose[1]=curr+1;
choose[2]=curr-1;
for(int i=0;i<3;i++){
//将未标记且未越界的临近点加入队列并标记
if (choose[i]>=0 && choose[i]<=100000 && minutes[choose[i]]==-1){
q.push(choose[i]);
minutes[choose[i]]=minutes[curr]+1;
}
}
}
}
int main(){
int x,y; cin>>x>>y;
if(y<=x){
cout<<x-y;
return 0;
}
memset(minutes,-1,sizeof(minutes));
//起始点标记并放入队列
minutes[x]=0;
q.push(x);
cout<<bfs(x,y);
return 0;
}