POJ-3278 Catch That Cow(广搜+剪枝)
2013-12-06 14:31
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.
Source
USACO 2007 Open Silver
思路:
三个方向(-1、 +1, *2 )的广度优先搜索;都说是水题,但WA了很多次,原因在于剪枝;
出错数据和出错代码如下:
当k=99999时,cur.k * 2 > 99999的数据是会被剪掉的,所以100000根本没有进入队列,也就不能直接-1得出结果;
发现问题后第一感觉就是把这条剪枝语句去掉,然后跑出23就提交了。。接着就Runtime Error了!
这次是visit数组溢出,考虑太不全面了。。 如果题目极限数据时1W,显然去掉这句后,接近或超过一万时*2入队再以此类推就相当大了,所以这儿的剪枝还必须有的;但如何剪呢?
关键时候大神提醒了下, cur.k * 2 <= k + 1 就行了, 原因在于, k + 2 及以后的可以由cur.k = (k + 2) / 2 时直接*2取得,就不用到这一步减1了。。想想确实精辟~
代码:
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 39887 | Accepted: 12412 |
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
思路:
三个方向(-1、 +1, *2 )的广度优先搜索;都说是水题,但WA了很多次,原因在于剪枝;
出错数据和出错代码如下:
当k=99999时,cur.k * 2 > 99999的数据是会被剪掉的,所以100000根本没有进入队列,也就不能直接-1得出结果;
发现问题后第一感觉就是把这条剪枝语句去掉,然后跑出23就提交了。。接着就Runtime Error了!
这次是visit数组溢出,考虑太不全面了。。 如果题目极限数据时1W,显然去掉这句后,接近或超过一万时*2入队再以此类推就相当大了,所以这儿的剪枝还必须有的;但如何剪呢?
关键时候大神提醒了下, cur.k * 2 <= k + 1 就行了, 原因在于, k + 2 及以后的可以由cur.k = (k + 2) / 2 时直接*2取得,就不用到这一步减1了。。想想确实精辟~
代码:
#include <stdio.h> #include <queue> #include <string.h> #define N 200030 using namespace std; struct Node{ int k; int s; }; int n, k; bool visit ; int bfs(); queue<Node>q; int main() { Node nw; while(scanf("%d%d", &n, &k)!=EOF) { while(!q.empty()) q.pop(); memset(visit, 0, sizeof(visit)); if(n == k) printf("0\n"); else{ nw.k = n; nw.s = 0; visit = 1; q.push(nw); int ans = bfs(); printf("%d\n", ans); } } return 0; } int bfs() { Node cur, nw; while(1){ cur.k = q.front().k; cur.s = q.front().s + 1; q.pop(); if(cur.k - 1 >= 0 && !visit[cur.k - 1]){ nw = cur; nw.k -= 1; if(nw.k == k) return nw.s; visit[nw.k] = 1; q.push(nw); } if(cur.k + 1 <= k && !visit[cur.k + 1]){ nw = cur; nw.k += 1; if(nw.k == k) return nw.s; visit[nw.k] = 1; q.push(nw); } if(cur.k * 2 <= k && !visit[cur.k * 2]){ nw = cur; nw.k *= 2; if(nw.k == k) return nw.s; visit[nw.k] = 1; q.push(nw); } } return 0; }
相关文章推荐
- poj 3278 Catch That Cow (BFS剪枝)
- POJ 3278 Catch That Cow(BFS 剪枝)
- POJ 3278 Catch That Cow(BFS 剪枝)
- poj 3278 Catch That Cow(BFS,剪枝)
- POJ 3278 Catch That Cow【C语言版】
- POJ3278——Catch That Cow
- POJ 3278 Catch That Cow
- POJ 3278 Catch That Cow
- POJ-3278 Catch That Cow
- POJ-3278 catch that cow 广度优先搜索
- poj 3278 Catch That Cow
- POJ 3278 Catch That Cow bfs 难度:1
- POJ - 3278 Catch That Cow(BFS)
- poj 3278 Catch That Cow(bfs)
- POJ 3278 Catch That Cow (BFS)
- POJ - 3278 Catch That Cow
- POJ 3278 Catch That Cow
- POJ 3278 Catch That Cow(bfs)
- POJ 3278 Catch That Cow
- poj3278——Catch That Cow