zoukankan      html  css  js  c++  java
  • POJ 3278 Catch That Cow bfs

    题目链接: 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
  • 相关阅读:
    kakfa 安全机制
    配置管理
    消费者基本操作
    生产者基本操作
    笔记:类加载器
    主题管理
    记一次学习SpringCloud将zk作为注册中心的bug
    JVM新生代进入老年代、何时触发Full GC?
    JVM调优
    线程池
  • 原文地址:https://www.cnblogs.com/icode-girl/p/5140109.html
Copyright © 2011-2022 走看看