题目链接: http://poj.org/problem?id=3278
题意:一维空间。初始坐标n。目标k。移动方式n-1,n+1,2*n,然后想知道到终点的步数最少是多少、
思路:不能再水的bfs。开始都嫌弃的不想敲。敲完愉快的RE了。然后知道 “剪枝” 的存在。就是优化吧。如果当前位置now>k了。那就只有now-1这一条路可以走的。恩。如果不剪枝的话,RE数据比如 0 100000。
重点是剪枝。
附AC代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <queue> 5 using namespace std; 6 7 int n, k; 8 int vis[400100]; 9 int step[400100]; 10 int que[400100]; 11 12 int dfs() { 13 memset(vis, 0, sizeof(vis)); 14 memset(step, 0, sizeof(step)); 15 int head = 0, tail = 0; 16 17 que[tail++] = n; 18 vis[n] = 1; 19 step[n] = 0; 20 21 while(head < tail) { 22 int now = que[head++]; 23 if (now == k) { 24 return step[k]; 25 } 26 27 if (now - 1 >= 0 && !vis[now-1]) { 28 que[tail++] = now - 1; 29 vis[now-1] = 1; 30 step[now-1] = step[now] + 1; 31 } 32 if (now < k && !vis[now+1]) { 33 que[tail++] = now+1; 34 vis[now+1] = 1; 35 step[now+1] = step[now] + 1; 36 } 37 if (now < k && !vis[now*2]) { 38 que[tail++] = now*2; 39 vis[now*2] = 1; 40 step[now*2] = step[now] + 1; 41 } 42 } 43 return -1; 44 } 45 46 int main() { 47 while(cin >> n >> k) { 48 int ans = dfs(); 49 cout << ans << endl; 50 } 51 return 0; 52 }