代码改变世界

暑假集训(1)第二弹 -----Catch the cow(Poj3278)

2016-07-16 16:11  HUAS_周林微  阅读(142)  评论(0编辑  收藏  举报

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.
 
 
问题分析:
简单bfs可以解答,分支为step+1;step-1;以及step*2. 第一次使用bfs以及容器;据说用容器比较慢,有时间想一想替代的方法0.0
 
 1 #include "iostream"
 2 #include "queue"
 3 
 4 using namespace std;
 5 char a[100010];
 6 void mset()
 7 {
 8     for (int i=0;i<100000;i++)
 9          a[i] = '1';
10 }
11 struct far
12 {
13     int w;
14     int step;
15 };
16 int bfs(int n,int k)
17 {
18    if (n>=k)
19         return n-k;
20     queue<far> q;
21     far fir,sec;
22     fir.w = n;
23     fir.step =0;
24     a[n] = '0';
25     q.push(fir);
26     while (!(q.empty()))
27     {
28        sec=q.front();
29        q.pop();
30        for (int i=1;i<=3;i++)
31        {
32              switch (i)
33               {
34                 case 1 : fir.w=sec.w+1; break;
35                 case 2 : fir.w=sec.w-1; break;
36                 case 3 : fir.w=sec.w*2; break;
37               }
38               fir.step=sec.step+1;
39               if (fir.w == k)   return fir.step;
40               if (fir.w>=0 && fir.w<=100000 && a[fir.w] == '1' )
41              {
42                 a[fir.w] ='0';
43                 q.push(fir);
44              }
45        }
46     }
47 }
48 int main()
49 {
50    int n,k;
51    while (cin>>n>>k)
52    {
53        mset();
54        cout<<bfs(n,k)<<endl;
55    }
56     return 0;
57 }
View Code