poj 3278 Catch That Cow bfs

来源:互联网 发布:淘宝冲印上传系统 编辑:程序博客网 时间:2024/06/16 19:38

链接:http://poj.org/problem?id=3278

Catch That Cow
Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 78862 Accepted: 24869

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

题意:从n到k,每一步可以+1,-1,*2,求到k的最短步数

思路:最短路问题,bfs,基础题,与石油大学的“奇怪的电梯”异曲同工

注意:

1.小剪枝,数组不能越界不然re

2.n>=k,只能不停-1

代码:

#define _CRT_SBCURE_MO_DEPRECATE    #include<iostream>    #include<stdlib.h>    #include<stdio.h>    #include<cmath>    #include<algorithm>    #include<string>      #include<string.h>    #include<set>    #include<queue>    #include<stack>    #include<functional>     using namespace std;const int maxn = 100000 + 10;const int INF = 0x3f3f3f3f;struct node {int x;int t;};int n, k;int vis[maxn];int bfs(int s) {memset(vis, 0, sizeof(vis));queue<node>Q;node a;a.x = s;a.t = 0;Q.push(a);while (!Q.empty()) {node now = Q.front();Q.pop();vis[now.x] = 1;if (now.x == k)return now.t;node next;for (int i = 0; i < 3; i++) {if (i == 0) {//后退一格if (now.x - 1 > 0 && !vis[now.x - 1] && now.x - 1 <= maxn) {next.x = now.x - 1;next.t = now.t + 1;vis[next.x] = 1;Q.push(next);}}if (i == 1) {//前进一格if (now.x + 1 <= maxn && !vis[now.x + 1]) {next.x = now.x + 1;next.t = now.t + 1;vis[next.x] = 1;Q.push(next);}}if (i == 2) {if (now.x * 2 <= maxn && !vis[now.x*2]) {next.x = now.x*2;next.t = now.t + 1;vis[next.x] = 1;Q.push(next);}}}}}int main(){while (scanf("%d %d", &n, &k) != EOF && n != -1 && k != -1) {if (n >= k) printf("%d", n - k);else printf("%d\n", bfs(n));}system("pause");return 0;}


0 0
原创粉丝点击