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.
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 }
text-drection:"none";
【OpenJ_Bailian - 4001】 Catch That Cow
原文:https://www.cnblogs.com/sky-stars/p/10934235.html