#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN=1e5+10;
bool visit[MAXN];
struct Status{
int position;
int time;
Status(int p,int t):position(p),time(t){}
};
int BFS(int n,int k){
queue<Status>myQueue;
myQueue.push(Status(n,0));
while (!myQueue.empty()){
Status current=myQueue.front();
if(current.position==k) return current.time; //已经到达,返回花费时间
myQueue.pop();
for(int i=0;i<3;++i){
Status next=current;
if(i==0) next.position-=1;
if(i==1) next.position+=1;
if(i==2) next.position*=2;
next.time+=1;
if(next.position<0||next.position>1e5||visit[next.position]) continue; //访问过或者位置越界则跳过
myQueue.push(next); //压入下一个可能的状态
visit[next.position]=true; //标记访问过
}
}
}
int main() {
int n,k;
scanf("%d%d",&n,&k);
fill(visit,visit+MAXN,false);
printf("%d\n",BFS(n,k));
system("pause");
return 0;
}
POJ 3278 抓住那头牛 (宽度优先搜索、队列实现)
最新推荐文章于 2022-10-05 09:20:21 发布