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?
5 17
4
题意概括:给两个数n和k,n可以+1,-1或*2,问n经过多少次运算可以得到k。
解题思路:用广搜算法,遍历每次的三种运算方法,注意m,n一开始就相同的情况。
代码:
#include<stdio.h>
#include<string.h>
struct note
{
int x,s;
}q[250000];
int book[250000];
int main()
{
int m,n,i,j;
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(book,0,sizeof(book));
int tail=1,head=1;
q[head].x=m;
q[head].s=0;
tail++;
book[m]=1;
int tx=m,flag=0;
while(head<tail)
{
for(i=0;i<3;i++)
{
if(tx==n)
{
flag=1;
break;
}
if(i==0)
tx=q[head].x-1;
if(i==1)
tx=q[head].x+1;
if(i==2)
tx=q[head].x*2;
if(tx<0||tx>100000)
continue;
//printf("%d\n",tx);
if(book[tx]==0)
{
book[tx]=1;
q[tail].x=tx;
q[tail].s=q[head].s+1;
tail++;
}
}
if(flag==1)
break;
head++;
}
printf("%d\n",q[tail-1].s);
}
return 0;
}