抓住那头牛(宽搜bfs)
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)相关推荐
- 抓住那头牛(广搜)--算法学习
题目描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上 ,农夫起始位于点N(0<=N<=100000),牛位于点 K(0<=K<=100000).农夫有两种移动方式: ...
- 广度优先搜索(BFS)——抓住那头牛(POJ 4001)
本文将以(POJ 4001)抓住那头牛 为例,讲解经典算法广度优先搜索(BFS)的STL写法 在实际写算法中,怎么能不使用更快.更方便.更准确.更高效的C++ STL模板呢 相信很多人都了解过广度优先 ...
- 信息学奥赛一本通(1253:抓住那头牛)
1253:抓住那头牛 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 14146 通过数: 5444 [题目描述] 农夫知道一头牛的位置,想要抓住它.农夫和 ...
- Catch That Cow(抓住那头牛C++)
Catch That Cow Farmer John has been informed of the location of a fugitive cow and wants to catch he ...
- C++广度优先搜索算法之抓住那头牛(Catch that cow)
抓住那头牛: 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有两种移动方式: ...
- 抓住那头牛(POJ NO.2971)
抓住那头牛(POJ NO.2971) 总时间限制: 2000ms 内存限制: 65536kB Question 描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0< ...
- 【信奥赛一本通】1253:抓住那头牛(详细代码)
[广度优先搜索算法]1253:抓住那头牛 1.[题目描述] 2.[代码] 1.[题目描述] [题目描述] 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000 ...
- 抓住那头牛(BFS广搜)
描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次移动 ...
- poj4001:抓住那头牛(BFS)
描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有两种移动方式: 1.从 ...
最新文章
- python3 爬虫 requests安装_爬虫开发环境部署
- 2017-3-10 SQL server 数据库 T--SQL语句
- bytevalue_Java Number byteValue()方法与示例
- remmima 不能保存_Vue项目实现表单登录页保存账号和密码到cookie功能_婳祎_前端开发者...
- Linux 系统之Sysvinit
- leetcode 273场周赛 Problem-C
- 计算机信息学中比较大小的代码,信息学奥赛计算机基础知识.doc
- (转) QImage总结
- android 自动打开qq,qq自动发消息脚本
- 史上最完美将windows键盘映射成mac键盘,绝对不需要买HHKB了
- 安装Pillow指定版本出错
- vs2008背景色配置
- 一文读懂 HTTP(超文本传输)协议
- 阿里IOT 应用托管部署 (2020/12/02)
- 精彩的“利益均衡”,尤其是“四”
- 卷妹的成长日记之javaweb day2
- 最先提出计算机程序存储原理概念的是( ),计算机考试选择题
- 为CentOS 6、7升级gcc至4.8、4.9、5.2、6.3、7.3等高版本
- 强化学习PPO代码讲解
- 计算机如何安装无线网络适配器,无线网络适配器是什么,无线网络适配器如何设置...