POJ 3278 Catch That Cow
题意:给一个起点和终点,只有三种走法n+1, n-1, n*2, 求最短需要的步数
解题思路:BFS,用BFS解决无权图的最短路问题。
注:很容易re,我re了10多次,有两个点要注意
1.如果起始点s>=终点e那么,就只能回退,所以step=s-e
2.编号不可能出边界(0, MAXSIZE)
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue> 5 #define MAXVERTEXNUM 1000100 6 using namespace std; 7 8 int dist[MAXVERTEXNUM]; 9 int Visited[MAXVERTEXNUM]; 10 int s, e; 11 12 void BFS() 13 { 14 queue<int> q; 15 q.push(s); 16 Visited[s] = 1; 17 18 while (!q.empty()) 19 { 20 int num = q.front(); 21 if (num == e) 22 return; 23 q.pop(); 24 25 int d1 = num * 2, d2 = num + 1, d3 = num - 1; 26 if (d1 < MAXVERTEXNUM && !Visited[d1]) 27 { 28 dist[d1] = dist[num] + 1; 29 q.push(d1); 30 Visited[d1] = 1; 31 } 32 if (!Visited[d2]) 33 { 34 dist[d2] = dist[num] + 1; 35 q.push(d2); 36 Visited[d2] = 1; 37 } 38 if (d3 >= 0 && !Visited[d3]) 39 { 40 dist[d3] = dist[num] + 1; 41 q.push(d3); 42 Visited[d3] = 1; 43 } 44 } 45 } 46 47 int main() 48 { 49 cin >> s >> e; 50 memset(dist, 0, sizeof(dist)); 51 memset(Visited, 0, sizeof(Visited)); 52 53 if (s >= e) 54 cout << s - e << endl; 55 else 56 { 57 BFS(); 58 cout << dist[e] << endl; 59 } 60 61 return 0; 62 }
不忘初心,方得始终