首页 > 代码库 > HDU 2717 Catch That Cow (bfs)

HDU 2717 Catch That Cow (bfs)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2717

Catch That Cow

Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 12615    Accepted Submission(s): 3902


Problem 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
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.
 
题目大意:在一条笔直的道路上,有一个农夫在A位置,一头牛在B位置,农夫一次可以搜索三个位置(例如农夫在x位置,他可以搜索x-1、x+1、x*2)问农夫至少需要几步能够找到牛。
解题思路: 用广搜 ,定义一个位置数组,每次搜索三个位置即可。
AC代码:
 1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 #include <stack> 6 #include <queue> 7 using namespace std; 8 int f[200020];  //记录步数  9 void bfs(int n,int k)10 {11     int a[3];  //位置数组 12     memset(f,0,sizeof(f));13     queue <int > q;14     q.push(n);15     f[q.front()] = 1;16     if (n == k)17         return ;18     while (!q.empty())19     {20         int t = q.front();21         int x = f[t];22         a[0] = t-1;  //三个位置 23         a[1] = t+1;24         a[2] = t*2;25         for (int i = 0; i < 3; i ++)26         {27             if (a[i] >= 0 && a[i] < 200001 && f[a[i]]==0)  //注意这里的边界值 28             {29                 q.push(a[i]);30                 f[a[i]] = x+1;  //在上一步的基础上加1 31             }32             if (a[i] == k)33                 return ;34         }35         q.pop();36     }37 }38 int main ()39 {40     int i;41     int n,k;42     while (~scanf("%d%d",&n,&k))43     {44         dfs(n,k);45         printf("%d\n",f[k]-1); //减去农夫本来在的位置那一步 46     }47     return 0;48 }

 

HDU 2717 Catch That Cow (bfs)