poj 3278 Catch That Cow (BFS+剪枝)
2015-07-09 13:02
465 查看
Catch That Cow
Description
Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number
line. Farmer John has two modes of transportation: walking and teleporting.
* Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute
* Teleporting: FJ can move from any point X to the point 2 × X in a single minute.
If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?
Input
Line 1: Two space-separated integers: N and K
Output
Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.
Sample Input
Sample Output
Hint
The fastest way for Farmer John to reach the fugitive cow is to move along the following path: 5-10-9-18-17, which takes 4 minutes.
Source
USACO 2007 Open Silver
题目链接:http://poj.org/problem?id=3278
题目大意:数字n到k,每次只能通过三种变换中的一种,即+1,-1或*2,求最少变换次数。
解题思路:BFS,剪枝特别重要,需要visit数组标记,已变换过的数字不再加入队列,能极大程度地提高效率。数组开大概200000的范围,超过次范围的数字舍去。一开始以为会出现负数,但仔细想想,因为n和k都是非负整数,变换过程如果出现负数不会是最优解,因此标记时不必考虑下标为负的情况。
代码如下:
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 58474 | Accepted: 18173 |
Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number
line. Farmer John has two modes of transportation: walking and teleporting.
* Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute
* Teleporting: FJ can move from any point X to the point 2 × X in a single minute.
If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?
Input
Line 1: Two space-separated integers: N and K
Output
Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.
Sample Input
5 17
Sample Output
4
Hint
The fastest way for Farmer John to reach the fugitive cow is to move along the following path: 5-10-9-18-17, which takes 4 minutes.
Source
USACO 2007 Open Silver
题目链接:http://poj.org/problem?id=3278
题目大意:数字n到k,每次只能通过三种变换中的一种,即+1,-1或*2,求最少变换次数。
解题思路:BFS,剪枝特别重要,需要visit数组标记,已变换过的数字不再加入队列,能极大程度地提高效率。数组开大概200000的范围,超过次范围的数字舍去。一开始以为会出现负数,但仔细想想,因为n和k都是非负整数,变换过程如果出现负数不会是最优解,因此标记时不必考虑下标为负的情况。
代码如下:
#include <cstdio> #include <queue> using namespace std; const int maxn=200010; int m,n; int vis1[maxn]; struct node { int x,step; }; int bfs() { node sd; sd.x=n; sd.step=0; queue<node>q; q.push(sd); while(!q.empty()) { node nd=q.front(); if(nd.x==m) return nd.step; q.pop(); for(int i=0;i<3;i++)//枚举三种变换方法 { if(i==0) { sd.x=nd.x-1; sd.step=nd.step+1; if(sd.x>=0&&!vis1[sd.x]) //该数字没有访问过,可加入队列 { vis1[sd.x]=1; q.push(sd); } } else if(i==1) { sd.x=nd.x+1; sd.step=nd.step+1; if(sd.x>maxn) //超出最大范围的数字舍去 continue; if(sd.x>=0&&!vis1[sd.x]) { vis1[sd.x]=1; q.push(sd); } } else { sd.x=nd.x*2; sd.step=nd.step+1; if(sd.x>maxn) continue; if(sd.x>=0&&!vis1[sd.x]) { vis1[sd.x]=1; q.push(sd); } } } } } int main() { scanf("%d%d",&n,&m); printf("%d\n",bfs() ); return 0; }
相关文章推荐
- Hello World for Java以及如何用 Eclipse创建相关文件
- java.net.NoRouteToHostException: Cannot assign requested address 解决
- Core Animation编程指南
- unreal engine4官网demo学习:第三人称视角游戏
- MySQL与Oracle 差异比较之函数比较
- quick-cocos2d-x游戏开发【3】——display.newSprite创建向导
- PopupWindon实例
- copy,assign,strong,retain,weak,readonly,nonatomic的区别
- codeforces 339D Xenia and Bit Operations 线段树
- MySQL安装和SQL语句入门
- linux(Centos)下编译安装gcc4.8.2
- 计算字符串相似度算法——Levenshtein
- leetCode 34.Search for a Range (搜索范围) 解题思路和方法
- 虚幻4 自动测试代码的写法
- 推荐系统-埋点
- Cadence ORCAD CAPTURE元件库介绍
- ios中关于检测应用安装和流量信息研究
- linux下编译安装boost库
- ORA-16019: cannot use LOG_ARCHIVE_DEST_1 with LOG_ARCHIVE_DEST or LOG_ARCHIVE_DUPLEX_DEST
- zf-安徽桐城关于(资源中心-数据录入)上传文件后没有进行处理Excel文件的原因