Catch That Cow

来源:互联网 发布:ipad商标侵权案 知乎 编辑:程序博客网 时间:2024/06/07 00:29

这道题目需要广搜+剪枝,如果不剪枝的话用队列就会超内存,但是如果用数组模拟的话虽然不会超内存但会浪费很多的时间

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 - 1 or + 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.
Sample Input
5 17
Sample Output
4
Hint
The fastest way for Farmer John to reach the fugitive cow is to move along the following path: 5-10-9-18-17, which takes 4 minutes.

队列实现:

#include<cstdio>#include<queue>#define MAX 100000using namespace std;struct list{int begin;int time;};bool appear[MAX+5];bool check(int a);int main(){int n,k;queue <struct list> q;struct list reco;scanf("%d%d",&n,&k);reco.begin=n;reco.time=0;appear[n]=true;q.push(reco);while(q.front().begin!=k){if(check(q.front().begin-1)){appear[q.front().begin-1]=true;reco.begin=q.front().begin-1;reco.time=q.front().time+1;q.push(reco);}if(check(q.front().begin+1)){appear[q.front().begin+1]=true;reco.begin=q.front().begin+1;reco.time=q.front().time+1;q.push(reco);}if(check(q.front().begin*2)){appear[q.front().begin*2]=true;reco.begin=q.front().begin*2;reco.time=q.front().time+1;q.push(reco);}q.pop();}printf("%d",q.front().time);return 0;}bool check(int a){if(a>=0&&a<=MAX&&appear[a]==false)return true;return false;}
数组模拟队列实现:

#include<cstdio>#define MAX 100000using namespace std;struct list{int begin;int time;}qn[MAX+5];bool appear[MAX+5];bool check(int a);int main(){int n,k,top,tail;top=0,tail=0;scanf("%d%d",&n,&k);qn[0].begin=n;qn[0].time=0;tail++;while(qn[top].begin!=k){if(check(qn[top].begin-1)){appear[qn[top].begin-1]=true;qn[tail].begin=qn[top].begin-1;qn[tail].time=qn[top].time+1;tail++;}if(check(qn[top].begin+1)){appear[qn[top].begin+1]=true;qn[tail].begin=qn[top].begin+1;qn[tail].time=qn[top].time+1;tail++;}if(check(qn[top].begin*2)){appear[qn[top].begin*2]=true;qn[tail].begin=qn[top].begin*2;qn[tail].time=qn[top].time+1;tail++;}top++;}printf("%d",qn[top].time);return 0;}bool check(int a){if(a>=0&&a<=MAX&&appear[a]==false)return true;return false;}




原创粉丝点击