[POJ-3278]Catch That Cow

题目描述

农夫知道一头牛的位置,想要抓住它。农夫和牛都于数轴上 ,农夫起始位于点 N(0<=N<=100000) ,牛位于点 K(0<=K<=100000) 。农夫有两种移动方式:
1、从 X移动到 X-1或X+1 ,每次移动花费一分钟;
2、从 X移动到 2*X ,每次移动花费一分钟;
假设牛没有意识到农夫的行动,站在原地不动。最少要花多少时间才能抓住牛?

Input

一行: 以空格分隔的两个字母: N 和 K

Output

一行: 农夫抓住牛需要的最少时间。

Sample Input

5 17

Sample Output

2

题目分析:
还是bfs模板题,在一条直线上面BFS,每次将X*2,X+1和X-1三种操作加入队列BFS,因为是BFS,所以先找到的一定是花时间最短的。一定要注意边界条件,不然可能导致runtime error或者wrong answer。其余见注释。

注:

不能用优先队列代替队列,因为队列是FIFO的,如果用优先队列的话就不能保证BFS搜到的是最短的(就不会顺着解答树一层一层搜,一层还没有搜完就会搜下一层)

AC代码

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int N = 100010;
int d[N];//记录时间
int n,k;
queue<int> q;
int bfs()
{
    memset(d,-1,sizeof d);
    d[n] = 0;
    q.push(n);
    int dx[] = {-1,1};
    while(!q.empty())
    {
        int t = q.front();
        q.pop();
        for(int i = 0;i<2;i++)
        {
            int x = t + dx[i];
            if (x>=0&&x<=100000&&d[x] == -1)
            {
                d[x] = d[t] +1;
                q.push(x);
            }
            if(x == k) return d[k];
        }
        int x = t*2;
        if (x>=0&&x<=100000&&d[x] == -1)
            {
                d[x] = d[t] +1;
                q.push(x);
            }
        if(x == k) return d[k];
    }
    return d[k];
}
int main()
{
    cin>>n>>k;
    cout<<bfs()<<endl;
    return 0;
}
posted @ 2020-03-30 20:47  Trounique  阅读(404)  评论(0)    收藏  举报