HDU-2717 Catch That Cow BFS

参考资料:https://blog.csdn.net/freezhanacmore/article/details/8168265

题意:

John在一根数轴上抓牛,1分钟内有两种移动方式:一个是进(退)1个单位长度,另一个是当前坐标翻倍,给定牛的坐标,和John的起始坐标,求解抓到牛的时间。

BFS基本思想:

1.工具:队列,数组(作访问标记)

2.首先入队一个起点,打上访问标记。

3.只要队列不为空,就出队一个队首元素,看看它满不满足条件。满足直接返回即可。不满足就将它周围相邻元素(即树的下一层)入队。

解题思路:

利用BFS,枚举三种移动方式,不断进行入队,和出队处理操作

核心代码:

int bfs(int x,int y)
{
    int head,next;
    q.push(x);
    step[x]=0;
    vis[x]=true;
    while(!q.empty())
    {
        head=q.front();
        q.pop();
        for(int i=0; i<3; i++)
        {
            if(i==0)next=head-1;
            else if(i==1)next=head+1;
            else next=2*head;
            if(next<0||next>=maxn)continue;
            if(!vis[next])
            {
                q.push(next);
                step[next]=step[head]+1;
                vis[next]=true;
            }
            if(next==y)return step[next];
        }
    }
}

一些细节:

1.多组数据输入,每次应当进行初始化,利用代码

while(!q.empty()) q.pop(); 

2.对于数组越界的情况,利用if语句排除

3.对于牛在人后面(即n>=k)的情况,直接输出n-k即可(只能选择后退移动方式)

补充DFS基本思想:

1.方法:递归调用

2.传入起点,首先判断满足条件与否。满足返回即可,不满足就枚举它的下一种情况(即先根遍历),继续调用这个函数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值