POJ 3278 Catch That Cow (BFS + 队列)

题目链接:http://poj.org/problem?id=3278


中文题意:农户和牛在一个数轴上,农户和牛的位置分别为 n , k 。牛的位置不变,农户有三种移动方式:1.从 n 移动到 n + 1。2.从 n 移动的 n - 1。3.从 n 变成 2 * n。且每种移动方式都需要花费一分钟,问农户最少需要多久能找到他的牛。

idea:典型 BFS + 队列 的题,每次把三种移动方式的结果入队(如果结果合法),记录从上一步到这一步的步数即可。板子题,我还废了这麽久,更加感觉到自己的弱。

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 const int N = 1e5 + 10;
 6 int tt, ed, q[N], t[N];  // t[N]记录步数,q[N]用数组模拟队列 
 7 bool b[N];  //记录当前位置是否出现过 
 8 
 9 void bfs(int o, int k)
10 {
11     q[ed ++ ] = o;
12     b[o] = true;
13     while (tt < ed)
14     {
15         int flag = 0;
16         for (int i = 0; i < 3; i ++ )
17         {
18             int temp;
19             if (!i)  temp = q[tt] + 1;
20             if (i == 1)  temp = q[tt] - 1;
21             if (i == 2)  temp = q[tt] * 2;
22             if (temp >= 0 && temp <= N)  //判断步数是否合法 
23             {
24                 if (!b[temp])
25                 {
26                     t[ed] = t[tt] + 1;
27                     if (temp == k)
28                     {
29                         cout << t[ed] << endl;
30                         flag = 1;
31                         break;
32                     }
33                     q[ed ++ ] = temp;
34                     b[temp] = true;
35                 }
36             }
37         }
38         tt ++ ;
39         if (flag == 1)  break;
40     }
41 }
42 
43 int main()
44 {
45     int o, k;
46     cin >> o >> k;
47     if (o >= k)  cout << o - k << endl;  //如果 o >= k 农户只能向后走 
48     else  bfs(o, k);
49     return 0;
50 }
View Code

 

posted @ 2019-10-15 11:08  chuyds  阅读(337)  评论(0编辑  收藏  举报