Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 70333 | Accepted: 22115 |
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
Output
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.
题意:就是通过三种方式从一个点到另一个点
这里使用队列可以减少空间的使用,用数组模拟就不知道要多大的空间了
注意这里搜索 5 到时 17 是用了4 步,
但是17到 5 就会用 12 步,注意题目说的运动顺序
a[m-1]=a[m]+1;上面这一步意思是:用了多少步走到点 m-1。其他同理可以得到
#include<stdio.h> #include<queue> #include<string.h> using namespace std; const int maxn=100001; int used[maxn]; int a[maxn]; int main() { int m,n; while(scanf("%d%d",&m,&n)!=EOF) { memset(used,0,sizeof(used)); memset(a,0,sizeof(a)); queue<int>q; q.push(m); used[m]=1; while(q.size()!=0) { m=q.front(); q.pop(); if(m==n) break; if(m-1>=0&&used[m-1]==0){ q.push(m-1); used[m-1]=1; a[m-1]=a[m]+1; } if(m+1<=maxn&&used[m+1]==0){ q.push(m+1); used[m+1]=1; a[m+1]=a[m]+1; } if(m*2<=maxn&&used[m*2]==0){ q.push(m*2); used[m*2]=1; a[m*2]=a[m]+1; } } printf("%d\n",a[n]); } return 0; }