Catch That Cow
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 13798 Accepted Submission(s): 4235
Problem 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?
* 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
Code:
#include <iostream> #include <queue> #define MAXL 100000 using namespace std; int next(int i, int x) { switch (i) { case 0:return (x - 1); break; case 1:return (x + 1); break; case 2:return (x * 2); break; } return 0; } int main() { int n, k; while (cin >> n >> k) { queue<int> q_x, q_step; bool vis[MAXL] = {}, flag = false; if (n == k) { cout << 0 << '\n'; continue; } q_x.push(n); q_step.push(0); vis[n] = true; while (!q_x.empty()) { for (int i = 0; i < 3; ++i) { int tx = next(i, q_x.front()); if (tx > MAXL || tx < 0) continue; if (!vis[tx]) { vis[tx] = true; q_x.push(tx); q_step.push(q_step.front() + 1); } if (tx == k) { flag = true; break; } } if (flag) break; q_x.pop(); q_step.pop(); } cout << q_step.back() << '\n'; } return 0; }