题目大意:农夫和奶牛在同一水平线上分别两个位置N和K(0<=N,K<=100000),农夫一分钟可以有三种移动方式,向前一步/向后一步/移动到2*N的位置,问农夫抓到奶牛的最快时间
输入:N K
输出:最少耗时
分析:bfs搜索,注意剪枝(vis数组判断是否遍历过、n>=k时直接输出n-k、排除越界可能)
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define N 100010
int step[N],vis[N];
queue<int>q;
int bfs(int n,int k){
int now,next;
step[n]=0;
vis[n]=1;
q.push(n);
while(!q.empty()){
now=q.front();
q.pop();
if(now==k) return step[now];
for(int i=0;i<3;i++){
if(i==0) next=now-1;
else if(i==1) next=now+1;
else if(i==2) next=now*2;
if(next<0||next>N) continue;//防止越界的剪枝
if(!vis[next]){
vis[next]=1;
q.push(next);
step[next]=step[now]+1;
}
}
}
}
int main(){
int n,k;
scanf("%d%d",&n,&k);
if(n>=k) printf("%d\n",n-k);
else printf("%d\n",bfs(n,k));
return 0;
}