【题解】POJ-3278 Catch That Cow

Catch That Cow (POJ - 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?

输入

Line 1: Two space-separated integers: N and K

输出

Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.

样例输入

1
5 17

样例输出

1
4

提示

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.

思路

一维bfs,注意剪枝

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int N = 1e5+5;

bool vis[N] = {0};
int n, k, ans = 0;

struct P {
int x;
int step;
};

int bfs() {
memset(vis, 0, sizeof(vis));

P sp;
sp.x = n;
sp.step = 0;

queue<P> q;
q.push(sp);
vis[sp.x] = 1;

while(!q.empty()) {
P tp = q.front();
q.pop();

if(tp.x==k) {
return tp.step;
}

P np = tp;

np.x = tp.x - 1;
if(np.x>=0 && !vis[np.x]) {
np.step = tp.step+1;
q.push(np);
vis[np.x] = 1;
}

np.x = tp.x + 1;
if(np.x<=N && !vis[np.x]) {
np.step = tp.step+1;
q.push(np);
vis[np.x] = 1;
}

np.x = tp.x * 2;
if(np.x<=N && !vis[np.x]) {
np.step = tp.step+1;
q.push(np);
vis[np.x] = 1;
}
}
return 0;
}

int main(void) {
scanf("%d%d", &n, &k);

if(n>k)
ans = n-k;
else
ans = bfs();

printf("%d\n", ans);
return 0;
}