Catch That Cow
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 118899 | Accepted: 37103 |
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
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.
题目分析:
题目大意就是直线走,每次有三种情况,每种情况都花费1min,前走1步或走到当前位置二倍的地方或回走一步,问初始状态到结束状态最快的的时间。很明显用BFS,因为给定了初始和结束状态,问初始到结束的最小代价。唯一需要注意的就是X要在范围内。
代码:
#include<iostream>
#include<queue>
using namespace std;
struct Node {
int n;
int step;
Node(int n = 0, int step = 0) { this->n = n; this->step = step; }
};
int visit[100005];
int s, e;
queue<Node> q;
int bfs() {
Node temp;
while (!q.empty()) {
temp = q.front();
q.pop();
int x = 0;
int y = 0;
if (temp.n == e)return temp.step;
//y在三种情况下是相同的,代价相同所以一起判断是否入队
//往回走一步
x = temp.n - 1;
y = temp.step + 1;
if (x <= 100000 && x >= 0 && !visit[x]) {
visit[x] = 1;
q.push(Node(x, y));
}
//往前走一步
x = temp.n + 1;
y = temp.step + 1;
if (x <= 100000 && x >= 0 && !visit[x]) {
visit[x] = 1;
q.push(Node(x, y));
}
//两倍
x = temp.n * 2;
y = temp.step + 1;
if (x <= 100000 && x >= 0 && !visit[x]) {
visit[x] = 1;
q.push(Node(x, y));
}
}
return 0;
}
int main() {
cin >> s >> e;
while (!q.empty()) q.pop();
visit[s] = 1;
q.push(Node(s, 0));
cout << bfs() << endl;
return 0;
}