题目链接: 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 }
View Code

 

posted on 2016-01-18 18:06  小小八  阅读(264)  评论(0编辑  收藏  举报