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 }