POJ3278 Catch That Cow(广搜BFS)
2015-05-30 20:27
288 查看
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.
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 54969 | Accepted: 17198 |
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.
题目大意:
给定一个初始值m,一个终值n,有三种方法分别为m + 1,m - 1,m * 2,求用最小的步数刚好等于n。解题思路:
最小距离,想到了广搜,广搜用队列解就可以,由于元素可能为0,所以m-1可能出现-1的情况,然而数组下标不能为-1,然后就开始一直RE,在POJ discuss上发现有人也是被坑了,果断改了,然后就AC了。AC代码:
#include<iostream> #include<queue> using namespace std; const int maxn = 200010; int step[maxn]; bool vis[maxn]; int m,n; void bfs() { int start = m; int final = n; queue<int> que; que.push(start); vis[start] = true; while(!que.empty()) { int element = que.front(); que.pop(); if(element + 1< maxn && !vis[element + 1]) //如果不越界又没有标记过,就加入队列 { que.push(element + 1); vis[element + 1] = true; step[element + 1] = step[element] + 1; //当前这个状态(element)到(element+1)一共经历了一步 } if(element - 1< maxn && !vis[element - 1] && element != 0) //此处要特别注意,如果element刚好为0的时候,数组下标为-1,re. { que.push(element - 1); vis[element - 1] = true; step[element - 1] = step[element] + 1; //当前这个状态(element)到(element-1)一共经历了一步 } if(element * 2 < maxn && !vis[element * 2]) { que.push(element * 2); vis[element * 2] = true; step[element * 2] = step[element] + 1; //当前这个状态(element)到(element*2)一共经历了一步 } if(vis[final]) { cout<<step[final]<<endl; break; } } } int main() { int i; while(cin>>m>>n) { if(m == n) { cout<<"0"<<endl; return 0; } else { for(i=0;i<=200000;i++) { step[i] = 0; vis[i] = false; } } bfs(); } return 0; }
相关文章推荐
- Android系统中标准Intent的使用
- 分布式进阶(十二)Docker固定Container IP
- css-demo
- 该虚拟机似乎正在使用中的错误解决办法
- hdu - 1254 推箱子 (bfs+bfs)
- jQuery实现DIV层的收缩展开效果
- Linux软件包安装1
- Android之Activity LaunchMode
- 百度之星初赛1006(计算几何:能包含凸包的最小矩形面积)
- ExecutorService常用方法和newFixedThreadPool创建固定大小的线程池
- 获取win系统hash值的工具
- Leetcode: Binary Tree Right Side View
- OA项目的计划和开发和开发流程
- IDF实验室-简单的js解密
- 5.7.1.1 单体内置对象
- 为mini2440编写的第一个驱动
- 分布式进阶(十一) Docker 常见错误汇总
- STM32自学笔记之串口通信(USART)
- 遇到 /*+ SYS_DL_CURSOR */ 这个hint
- 分布式进阶(十一) Docker 常见错误汇总