Catch That Cow

题目

     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.
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.



* 这道题是bfs的模板题 也就是求类似于最短路径的问题
* 如果我们用dfs去做的话就会TLE,因为我们只用求出最短的用时而不是把所有的到达方式都求出来
* 很坑的是这题是多输入的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <queue>
#include <string.h>
#define MAX 100000
using namespace std;

queue<int> pos;
int t[MAX];
int vis[MAX];

int main() {
int n,k,front;

while(cin>>n>>k){
memset(t,0,sizeof(t));
memset(vis,0,sizeof(vis));
pos = queue<int>();
pos.push(n);
vis[n] = 1;
while(!pos.empty()){
front = pos.front();
if(front == k)
break;
if(front+1 <= k && !vis[front+1]){
pos.push(front+1);
t[front+1] = t[front]+1;
vis[front+1] = 1;
}
if(front-1>=0 && !vis[front-1]){
pos.push(front-1);
t[front-1] = t[front]+1;
vis[front-1] = 1;
}
if(front*2<=MAX && !vis[front*2]){
pos.push(front*2);
t[front*2] = t[front]+1;
vis[front*2] = 1;
}
pos.pop();
}
cout<<t[k]<<endl;
}
return 0;
}