【OpenJ_Bailian

Catch That Cow


Descriptions:

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.

题目链接:
 
题目大意
农夫约翰获知了一头逃走的牛的位置,想要将它立即抓住。他从数轴上的一个点 N (0 ≤ N ≤ 100,000) 出发,牛位于相同数轴上的点 K (0 ≤ K ≤ 100,000)。农夫约翰有两种前进方式:行走和神行。
行走:农夫约翰可以从任何 X 移动到点 X - 1 或 X + 1,只需要一分钟;
神行:农夫约翰可以从任何点 X 移动到点 2 × X,也只需要一分钟。
如果那头逃走的牛并不知道对它实施的抓捕行动,因此完全不移动,那么农夫约翰花多少时间可以抓住这头牛?
Input
第一行包含两个以空格分隔的整数: N 和 K
Output
第一行输出农夫约翰抓住逃走的牛,所花费的最短时间 (分钟)。
Hint
农夫约翰抓住逃走的牛的最快方式,是按如下路径移动:5-10-9-18-17,这花费了 4 分钟。
 
这题我的想法就是bfs,加个优先队列吧,毕竟求最小话费时间,优先队列是一定没有错的,个人习惯写法。大致判断一下农夫下一步该走到哪里,那个地方是否满足2个条件:是否在0-100000之间;这个点是否走过。符合这两点就能入队了。break的判断就是,农夫现在的地方等于牛的地方,写的比较粗糙,见谅。
 
AC代码
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <fstream>
 4 #include <algorithm>
 5 #include <cmath>
 6 #include <deque>
 7 #include <vector>
 8 #include <queue>
 9 #include <string>
10 #include <cstring>
11 #include <map>
12 #include <stack>
13 #include <set>
14 using namespace std;
15 int N,K;
16 int vis[100010];//路径判断是否走过
17 struct node
18 {
19     int n,k;//n为现在的地方,k为牛的地方
20     int step;//步数即时间
21     friend bool operator<(node a,node b)//步数小的现出来,即时间少
22     {
23         return a.step>b.step;
24     }
25 };
26 priority_queue<node>q;
27 void bfs()
28 {
29     node now;//初始化now
30     now.n=N;
31     now.k=K;
32     now.step=0;
33     q.push(now);
34     while(!q.empty())
35     {
36         node mid=q.top();
37         q.pop();
38         if(mid.n==mid.k)//农夫现在的地方等于牛的地方,即找到牛了
39         {
40             cout << mid.step <<endl;
41             return;
42         }
43         //农夫的三种走法判断是否符合题意
44         if(mid.n+1>=0&&mid.n+1<=100000&&!vis[mid.n+1])
45         {
46             node last;//更新队列
47             last.k=K;
48             last.n=mid.n+1;
49             last.step=mid.step+1;//步数+1
50             vis[mid.n+1]=1;//标记路径
51             q.push(last);//入队
52         }
53         if(mid.n-1>=0&&mid.n-1<=100000&&!vis[mid.n-1])
54         {
55             node last;
56             last.k=K;
57             last.n=mid.n-1;
58             last.step=mid.step+1;
59             vis[mid.n-1]=1;
60             q.push(last);
61         }
62         if(mid.n*2>=0&&mid.n*2<=100000&&!vis[mid.n*2])
63         {
64             node last;
65             last.k=K;
66             last.n=mid.n*2;
67             last.step=mid.step+1;
68             vis[mid.n*2]=1;
69             q.push(last);
70         }
71     }
72 }
73 int main()
74 {
75     memset(vis,0,sizeof(vis));//初始化路径都为0,即没有走过
76     cin >> N >> K;
77     vis[N]=1;
78     bfs();
79     return 0;
80 }
原文地址:https://www.cnblogs.com/sky-stars/p/10934235.html