POJ-3278-Catch That Cow

来源:互联网 发布:网络博客正规吗 编辑:程序博客网 时间:2024/06/05 02:03

题目信息:

Catch That Cow

Description

Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a pointN (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 orX+ 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 andK

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.

题意:有一个农民和一头牛,他们在一个数轴上,牛在k位置保持不动,农户开始时在n位置。设农户当前在M位置,每次移动时有三种选择:1.移动到M-1;2.移动到M+1位置;3.移动到M*2的位置。问最少移动多少次可以移动到牛所在的位置。所以可以用广搜来搜索这三个状态,直到搜索到牛所在的位置。


代码部分:

#include <stdio.h>#include <string.h>#include <queue>using namespace std;int N, K;struct Node{int x;int steps;}node, t;bool vis[200005];void BFS(){queue<Node>D;D.push(node);while(!D.empty()){node = D.front();D.pop();if(node.x == K){printf("%d\n", node.steps);break;}node.steps++;if(node.x > 0 && !vis[node.x - 1]){t = node;t.x--;D.push(t);vis[t.x] = true;} if(node.x < K && !vis[node.x + 1]){t = node;t.x++;D.push(t);vis[t.x] = true;}if(node.x < K && !vis[node.x * 2]){t = node;t.x *= 2;D.push(t);vis[t.x] = true;}}}int main(){while(scanf("%d%d", &N, &K) != EOF){memset(vis, false, sizeof(vis));node.x = N;node.steps = 0;vis[N] = true;BFS();}return 0;}


0 0
原创粉丝点击