书山有路,学海无涯

超超超简单的bfs——POJ-3278

Catch That Cow
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 89836   Accepted: 28175

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.
 
 
起点在n,终点是k,每一步可以是+1、-1或*2,最少走几步?
 
 1 #include<stdio.h>
 2 #include<queue>
 3 #include<string.h>
 4 using namespace std;
 5 int a[200005];//一个2倍大小的数组代表可以走到的位置,因为有乘二所以要开二倍以防RE,a[i]=x  -->  走到坐标i需要x步
 6 int main()
 7 {
 8     int n, k, t;
 9     queue<int>q;
10     scanf("%d%d", &n, &k);
11     memset(a, -1, sizeof(a));//所有坐标初始化为-1
12     a[n] = 0;                //n走到n当然是需要步
13     q.push(n);                //当前位点入队
14     while (!q.empty())
15     {
16         t = q.front();        //读取队首
17         q.pop();            //删除队首
18         if (t == k)            //若到达终点则直接输出并结束
19         {
20             printf("%d\n", a[k]);
21             return 0;
22         }
23         if (t - 1 >= 0 && a[t - 1] == -1)//可能到达的结点入队,要判断是否越界,走过的不再走
24         {
25             a[t - 1] = a[t] + 1; q.push(t - 1);//下一步走到的位点所需步数是当前位点的步数+1
26         }
27         if (t + 1 < 200001 && a[t + 1] == -1)
28         {
29             q.push(t + 1); a[t + 1] = a[t] + 1;
30         }
31         if (t * 2 < 200004 && a[t * 2] == -1)
32         {
33             q.push(t * 2); a[t * 2] = a[t] + 1;
34         }
35     }
36 }

简单的bfs

 
posted @ 2017-05-09 19:42  Jimmy_King  阅读(189)  评论(0编辑  收藏  举报