题目:
Description:
Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting.
* Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute
* Teleporting: FJ can move from any point X to the point 2 × X in a single minute.If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?
Input
Line 1: Two space-separated integers: N and K
Output
Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.
思路:
采用剪枝的bfs,如果农夫走的比奶牛远就只能按(X-1)的方式往后走,如果奶牛走的比农夫远就有(2*X),(X-1),(X+1)三种分支可能。
注意标记走过的地方,防止重复使代码运行超时。
visited数组不能开小,至少要大于2*p(max),否则会runtime error。
代码:
#include<iostream>
#include<queue>
using namespace std;
const int MAX=200030;
int visited[MAX];//标记走过的地方,不要重复走
struct node {
node(int p,int s) {
place=p;//农夫位置
step=s;//农夫步数
};
int place;
int step;
};
queue<node>q;
void bfs(int k,int n);
int main() {
int K,N;//K是奶牛位置,N是农夫位置
cin>>N>>K;
q.push(node(N,0));
bfs(K,N);
return 0;
};
void bfs(int k,int n) {
while(q.empty()==0) {
node now=q.front();
q.pop();
int t=now.step;
int p=now.place;
//越界的不处理
if(p>100000)continue;
//刚好走到一起
if(p==k) {
cout<<t;
return;
};
//如果农夫走得比奶牛远
if(p>k&&visited[p-1]==0) {
q.push(node(p-1,t+1));
visited[p-1]=1;
};
//如果奶牛走得比农夫远
if(p<k&&visited[p+1]==0) {
q.push(node(p+1,t+1));
visited[p+1]=1;
}
if(p<k&&visited[p*2]==0) {
q.push(node(p*2,t+1));
visited[p*2]=1;
}
if(p<k&&visited[p-1]==0) {
q.push(node(p-1,t+1));
visited[p-1]=1;
};
};
}