POJ - 3278抓牛牛

///题意:大牛怎样最快的抓到小牛;给你大牛和小牛的坐标,大牛怎样才能最快的抓到小牛
///说来大牛的走位也真是神奇(腿长一点走当前坐标的两倍,短一点就往后退一步或者前进一步) 但是那些走都算一步;
///思路:一维的bfs走一走
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;

const int maxn=1e7+7;

struct node {int x,step;};///位置和大牛走的步数
int n,m;
bool vis[maxn];

void bfs(int n)
{
    memset(vis,false,sizeof(vis));
    node now,next;
    now.x=n;
    now.step=0;
    vis[now.x]=true;
    queue<node>Q;
    Q.push(now);
    while(!Q.empty())
    {
        now=Q.front(),Q.pop();
        vis[now.x]=true;
        if(now.x==m) {printf("%d\n",now.step);return ;}
        ///三种走法
        if(now.x>=1&&!vis[now.x-1])
        {
            next.x=now.x-1;
            next.step=now.step+1;
            vis[next.x]=true;
            Q.push(next);
        }
        if(now.x+1<=m&&!vis[now.x+1])
        {
            next.x=now.x+1;
            next.step=now.step+1;
            vis[next.x]=true;
            Q.push(next);
        }
        ///存在2倍的情况时候自只能是小牛在大牛的前面;
        if(now.x*2<=2*m&&!vis[now.x*2])///最开始的写法是now.x*2<=m ,WA WA WA~~~,然后组了几个样例发现是可以越界的而且是2*m;
        {
            next.x=now.x*2;
            next.step=now.step+1;
            vis[next.x]=true;
            Q.push(next);
        }
    }

}
int main ()
{
    while(~scanf("%d %d",&n,&m))
    {
        if(n>=m) {printf("%d\n",n-m);continue;}///大牛腿短的时候,它只能往后退,可以节省一部分时间;
        bfs(n);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值