Description
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N,牛位于点K。
农夫有两种移动方式:
1.从X移动到X−1或X+1,每次移动花费一分钟。
2.从X移动到2∗X,每次移动花费一分钟。
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
Input
第一行为两个整数,分别为N和K。
Output
一个整数,农夫抓到牛所要花费的最小分钟数。
Sample Input 1
5 17
Sample Output 1
4
Hint
0<=N<=100000
0<=K<=100000
Time Limit
1000MS
Memory Limit
256MB

分析:由题意求农夫抓到牛的最短时间,便知此题是宽搜。我们可以把农夫的坐标和已经花费的分钟数打包成一个状态,作为宽搜的结点。同时由于这题的特点,先搜索到一定花时间更短,没必要重复搜索,因此这题可以根据坐标是否搜索过剪枝。
参考代码:

#include<stdio.h>
#include<queue>
using namespace std;struct state//状态打包
{long long int x;//坐标long long int t;//时间void operator=(const state &s){x=s.x;t=s.t;}state(){}state(long long int X,long long int T){x=X;t=T;}
};queue<state> q;
long long int n,k;//农夫起始点,牛坐标
bool vis[200001]={0};//标记已经搜索过的坐标int main()
{scanf("%lld%lld",&n,&k);if(n>=k){//农夫在牛右边,只能以X-1的方式向左移动抓牛printf("%lld",n-k);return 0;}state head;//接收队头结点long long int dos,time;//队头结点的坐标、时间q.push(state(n,0));//加入农夫初态vis[n]=true;//标记农夫初位置while(!q.empty()){head=q.front();q.pop();dos=head.x,time=head.t;if(dos==k){//已经到牛的位置了,退出搜索printf("%lld",time);break;}//一定要 先判断数组越界 再判断重复搜索!if(dos+1<=200000 && !vis[dos+1]){vis[dos+1]=true;q.push(state(dos+1,time+1));}if(dos-1>=0 && !vis[dos-1]){vis[dos-1]=true;q.push(state(dos-1,time+1));}if(2*dos<=200000 && !vis[2*dos]){vis[2*dos]=true;q.push(state(2*dos,time+1));}}return 0;
}

易错点总结:要先判断数组越界再判断重复搜索。举个例子:如果这么写if(!vis[dos-1] && dos-1>=0),当dos=0,dos-1=-1,下标已经越界,但是程序会先走!vis[dos-1],从而发生了数组越界访问,导致某些oj评测点结果为Runtime Error。

抓住那头牛(宽搜bfs)相关推荐

  1. 抓住那头牛(广搜)--算法学习

    题目描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上 ,农夫起始位于点N(0<=N<=100000),牛位于点 K(0<=K<=100000).农夫有两种移动方式: ...

  2. 广度优先搜索(BFS)——抓住那头牛(POJ 4001)

    本文将以(POJ 4001)抓住那头牛 为例,讲解经典算法广度优先搜索(BFS)的STL写法 在实际写算法中,怎么能不使用更快.更方便.更准确.更高效的C++ STL模板呢 相信很多人都了解过广度优先 ...

  3. 信息学奥赛一本通(1253:抓住那头牛)

    1253:抓住那头牛 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 14146     通过数: 5444 [题目描述] 农夫知道一头牛的位置,想要抓住它.农夫和 ...

  4. Catch That Cow(抓住那头牛C++)

    Catch That Cow Farmer John has been informed of the location of a fugitive cow and wants to catch he ...

  5. C++广度优先搜索算法之抓住那头牛(Catch that cow)

    抓住那头牛: 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有两种移动方式: ...

  6. 抓住那头牛(POJ NO.2971)

    抓住那头牛(POJ NO.2971) 总时间限制: 2000ms 内存限制: 65536kB Question 描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0< ...

  7. 【信奥赛一本通】1253:抓住那头牛(详细代码)

    [广度优先搜索算法]1253:抓住那头牛 1.[题目描述] 2.[代码] 1.[题目描述] [题目描述] 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000 ...

  8. 抓住那头牛(BFS广搜)

    描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次移动 ...

  9. poj4001:抓住那头牛(BFS)

    描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有两种移动方式: 1.从 ...

最新文章

  1. python3 爬虫 requests安装_爬虫开发环境部署
  2. 2017-3-10 SQL server 数据库 T--SQL语句
  3. bytevalue_Java Number byteValue()方法与示例
  4. remmima 不能保存_Vue项目实现表单登录页保存账号和密码到cookie功能_婳祎_前端开发者...
  5. Linux 系统之Sysvinit
  6. leetcode 273场周赛 Problem-C
  7. 计算机信息学中比较大小的代码,信息学奥赛计算机基础知识.doc
  8. (转) QImage总结
  9. android 自动打开qq,qq自动发消息脚本
  10. 史上最完美将windows键盘映射成mac键盘,绝对不需要买HHKB了
  11. 安装Pillow指定版本出错
  12. vs2008背景色配置
  13. 一文读懂 HTTP(超文本传输)协议
  14. 阿里IOT 应用托管部署 (2020/12/02)
  15. 精彩的“利益均衡”,尤其是“四”
  16. 卷妹的成长日记之javaweb day2
  17. 最先提出计算机程序存储原理概念的是( ),计算机考试选择题
  18. 为CentOS 6、7升级gcc至4.8、4.9、5.2、6.3、7.3等高版本
  19. 强化学习PPO代码讲解
  20. 计算机如何安装无线网络适配器,无线网络适配器是什么,无线网络适配器如何设置...

热门文章

  1. vue 仿写微信公众号自定义菜单
  2. 可用在404 的几句诗词
  3. matlab小船渡河物理模型,【物理】小船渡河模型及关联速度问题
  4. 多个约束的lagrange multiplier证明.
  5. python离线安装selenium_python34怎么离线安装selenium
  6. 24微信小程序开发2
  7. 八、基于FPGA的以太网协议介绍(二)
  8. win10三国志14已停止工作解决方法--win10专业版
  9. 密苏里大学理工学院计算机,东南密苏里州立大学的计算机专业如何?
  10. 土巴兔CEO王国彬:这五点,决定了你事业的上限