基础宽搜 奶牛最少步数问题

来源:互联网 发布:安卓手机plc编程软件 编辑:程序博客网 时间:2024/06/01 20:11


 

I - Catch That Cow

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 pointK (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.





#include <cstdio>#include <cstdlib>#include <cmath>#include <algorithm>#include <iostream>#include <cstring>#include <vector>#include <queue>#include <stack>#include <set>#include <map>#define LL long long#define INF 0x3f3f3f3f#define mem(a, b) memset(a, b, sizeof(a))#define PI 3.1415926using namespace std;const int N = 199999;using namespace std;int vis[N], d[N];queue<int> que;int bfs(int n, int k){    d[n] = 0;    vis[n] = 1;    que.push(n);    while(!que.empty())    {        int p = que.front();        que.pop();              if(p == k)        {             return d[k];        }        if(2 * p < N && !vis[2 * p])        {            vis[2 * p] = 1;            d[2 * p] = d[p] + 1;            que.push(2 * p);                    }        if(p - 1 >= 0 && !vis[p - 1])        {            vis[p - 1] = 1;            d[p - 1] = d[p] + 1;            que.push(p - 1);                   }        if(p + 1 < N && !vis[p + 1])        {            vis[p + 1] = 1;            d[p + 1] = d[p] + 1;            que.push(p + 1);                   }            }}int main(){    int n, k;    while(scanf("%d%d", &n, &k) != EOF)    {        memset(vis, 0, sizeof(vis));        memset(d, -1, sizeof(d));        while(!que.empty()) que.pop();        printf("%d\n", bfs(n, k));    }    return 0;}





原创粉丝点击