POJ - 3278 Catch That Cow (bfs)

题意:农夫在n,奶牛在m,农夫可以进行一下操作:

FJ can move from any point X to the points - 1 or + 1 in a single minute
FJ can move from any point X to the point 2 × X in a single minute.

也就是说农夫可以进行x-1,x+1,2*x三种操作,问最少几部内可以抓到奶牛。

首先如果n>m,农夫肯定只能进行x-1操作来返回,才能抓到牛,这是需要花费n-m次操作。

这是道很水的BFS的模板题,从农夫位置开始,持续的对n-1,n+1,2*n进行搜索即可,搜到了就返回步数。

代码如下:

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <queue>
#include <string.h>
int flag[100002];
using namespace std;
int n,m,cnt;
queue<int> q;
int bfs(int i,int j)
{
    q.push(i);
    int date,d;
    flag[i]=1;
    while(!q.empty())
    {
        date=q.front();
        q.pop();
        for(int k=0;k<3;k++)
        {
            if(k==0)
                d=date+1;
            else if(k==1)
                d=date-1;
            else if(k==2)
                d=date*2;
            if(d>=0&&d<=100000&&flag[d]==0)
            {
                flag[d]=flag[date]+1;
                //printf("%d   %d\n",d,flag[d]);
                q.push(d);
                if(d==j)
                    return flag[d]-1;
            }
        }
    }
    return 0;
}
int main()
{
    while(cin>>n>>m)
    {
        memset(flag, 0, sizeof(flag));
        cnt=0;
        if(n>m)
            printf("%d\n",n-m);
        else
            printf("%d\n",bfs(n, m));
    }
}

猜你喜欢

转载自blog.csdn.net/hrbust_cxl/article/details/88577241