Catch That Cow

本文解析了一道关于牛仔追赶逃逸奶牛的算法题,通过BFS(宽度优先搜索)算法实现,详细展示了如何从初始位置出发,利用步行和瞬间传送两种方式,在最短时间内捕捉到静止不动的奶牛。题目来源于USACO2007公开赛银组,代码示例清晰,适合算法初学者理解与实践。

题目链接

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 - 1 or + 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

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<queue>
 5 struct Node{
 6     int x,step;
 7     Node (int xx = 0,int xstep = 0) : x(xx),step(xstep){}
 8 };
 9 using namespace std;
10 int bfs(int n,int k){
11     Node tmp;
12     int t,vis[100005];
13     memset(vis,false,sizeof(vis));
14     queue <Node> Q;
15     Q.push(Node(n,0));
16     vis[n] = true;
17     while(!Q.empty()){
18         tmp = Q.front();
19         Q.pop();
20         if(tmp.x == k)
21             return tmp.step;
22         for(int i = 0;i < 3;i++){
23             if(i == 0){
24                 t = tmp.x - 1;
25                 if(t >= 0 && t <= 100000 && vis[t] == false){//设置取值范围!!
26                     vis[t] = true;
27                     Q.push(Node(t,tmp.step + 1));
28                 }
29             }
30             else if(i == 1){
31                 t = tmp.x + 1;
32                 if(t >= 0 && t <= 100000 && vis[t] == false){
33                     vis[t] = true;
34                     Q.push(Node(t,tmp.step + 1));
35                 }
36             }
37             else{
38                 t = tmp.x * 2;
39                 if(t >= 0 && t <= 100000 && vis[t] == false){
40                     vis[t] = true;
41                     Q.push(Node(t,tmp.step + 1));
42                 }
43             }
44         }
45     }
46     return 0;
47 }
48 int main(){
49     int n,k;
50     scanf("%d%d",&n,&k);
51     printf("%d\n",bfs(n,k));
52     return 0;
53 }
View Code

 

转载于:https://www.cnblogs.com/Luckykid/p/10021837.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值