试题请参见: http://poj.org/problem?id=3278
题目概述
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?
解题思路
广度优先搜索, 最先到达k的解一定是最优解.
遇到的问题
- WA了不知道多少次, 然后我将队列的变量
points
作为全局变量竟然就AC了! 可是这种时候不应该RE的吗!! 太诡异~ - 再就是对于
n >= k
的情况需要做特殊判断, 否则也会WA.
源代码
#include <iostream>
#include <queue>
const size_t SIZE = 100001;
std::queue<int> points;
int step[SIZE] = {0};
bool isVisited[SIZE] = {0};
int getMinStep(int n, int k) {
points.push(n);
isVisited[n] = true;
step[n] = 0;
while ( !points.empty() ) {
int currentPoint = points.front();
points.pop();
for ( int i = 0; i < 3; ++ i ) {
int nextPoint = i == 0 ? currentPoint - 1 : (i == 1 ? currentPoint + 1 : currentPoint * 2);
if ( nextPoint < 0 || nextPoint > SIZE || isVisited[nextPoint] ) {
continue;
}
if ( !isVisited[nextPoint] ) {
points.push(nextPoint);
isVisited[nextPoint] = true;
step[nextPoint] = step[currentPoint] + 1;
}
if ( nextPoint == k ) {
return step[nextPoint];
}
}
}
}
int main() {
int n = 0, k = 0;
std::cin >> n >> k;
if ( n >= k ) {
std::cout << n - k << std::endl;
} else {
std::cout << getMinStep(n, k) << std::endl;
}
return 0;
}