Catch That Cow
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 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.
Source |
解题报告:
入门级广搜,写了两种队列,一个使用C++ STL里面的queue,另一种是手写的队列,好像都差不多,练练手而已啦!。。
代码一(STL queue):
#include<stdio.h>
#include<queue>
#include<algorithm>
#include<string.h>
#define MAXN 100010
using namespace std;
int d[MAXN],vis[MAXN];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=0;i<=k;i++)vis[i]=0;
queue<int>q;
int v=n;
d[v]=0;vis[v]=1;
q.push(v);
while(!q.empty())
{
if(v==k)break;
v=q.front();
q.pop();
if(v+1<MAXN&&!vis[v+1])
{
d[v+1]=d[v]+1;
vis[v+1]=1;
q.push(v+1);
}
if(v-1>=0&&!vis[v-1])
{
d[v-1]=d[v]+1;
vis[v-1]=1;
q.push(v-1);
}
if(v*2<MAXN&&!vis[v*2])
{
d[v*2]=d[v]+1;
vis[v*2]=1;
q.push(v*2);
}
if(v+1==k)break;
if(v-1==k)break;
if(v*2==k)break;
}
printf("%d\n",d[k]);
return 0;
}
代码二(手写的队列):
#include<stdio.h>
#define MAXN 100010
using namespace std;
int main()
{
int d[MAXN],vis[MAXN],n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
int que[2*MAXN],front,rear;
for(int i=0;i<=k;i++)vis[i]=0;
int v=n;
front=0;rear=1;
que[front]=v;
d[v]=0;
while(front<rear)
{
if(v==k)break;
v=que[front++];
if(v+1<MAXN&&!vis[v+1])
{
vis[v+1]=1;
d[v+1]=d[v]+1;
que[rear++]=v+1;
if(v+1==k)break;
}
if(v-1>=0&&!vis[v-1])
{
vis[v-1]=1;
d[v-1]=d[v]+1;
que[rear++]=v-1;
if(v-1==k)break;
}
if(v*2<MAXN&&!vis[v*2])
{
vis[v*2]=1;
d[v*2]=d[v]+1;
que[rear++]=v*2;
if(v*2==k)break;
}
}
printf("%d\n",d[k]);
}
return 0;
}