zoukankan      html  css  js  c++  java
  • poj3278 Catch That Cow

    http://poj.org/problem?id=3278

    题目大意:农场主约翰得知了一头逃跑的母牛的行踪,想立即抓住她。他从一个点开始,N(0≤N≤100000)在数轴上,牛点K(0≤K≤100000)在同一数轴。农夫约翰有两种交通方式:步行和心灵运输。

    *行走:FJ可以在一分钟内从任意点X移动到点X - 1或X + 1。

    *传送:FJ可以在一分钟内从任何点X移动到点2。

    如果奶牛不知道它的追求,根本不动,农夫约翰要多久才能取回它?

    也就是说如果John所在位置大于等于母牛所在位置,那么只能倒退直接得到最优解。如果John所在位置小于母牛所在位置,那么每一个结点都有三个可选结点,分别是当前节点+1,-1,*2。

    选取适当的剪枝函数,当当前结点越界时即<0或>100000时相应结点不进入队列,当找到一个可行解(最优解)时,即到达了母牛的位置,直接返回最优解step[k]。

     

    算法思想:队列式分支限界法,以广度优先搜索三叉树,设置一个队列q来存储从John所在的位置开始入队,然后出队并开始拓展三个子结点(三个子节点入队)。设置一个数组step[i]来记录走到某位置的最少时间,并设置一个数组vis[i]来记录是否到过某位置,如果到过表示前面有更优解,便可以舍弃相应子节点(不入队列)。

    PS: 如果不了解STL queue容器的用法,可以查一下。

     1 #include<queue>//使用queue 容器
     2 #include <iostream>
     3 #include <cstring>
     4 #define N 100001
     5 using namespace std;
     6 int bfs(int n, int k) {
     7     queue<int>q;//利用队列模拟求解
     8     int step[N];//到某位置的走的最少时间
     9     bool vis[N];
    10     memset(vis, false, sizeof(vis));
    11     memset(step, 0, sizeof step);
    12     int x, next;
    13     step[n] = 0;//初始化在n时为0步
    14     vis[n] = true;//标记访问过
    15     q.push(n);
    16     while (!q.empty()) {
    17         x = q.front();//当前位置
    18         q.pop();
    19         for (int i = 0; i < 3; i++) {//模拟三种情况
    20             if (i == 0) next = x - 1;
    21             else if (i == 1) next = x + 1;
    22             else if (i == 2) next = x * 2;
    23             if (next<0 || next>N) continue;
    24             if (!vis[next]) {//如果访问过 说明前面有更好的解
    25                 vis[next] = true;
    26                 q.push(next);
    27                 step[next] = step[x] + 1;//到next位置时的最少时间
    28             }
    29             if (next == k) return step[next];//到k时的最少时间
    30         }
    31     }
    32 }
    33 int main() {
    34     int n, k;
    35     cin >> n >> k;
    36     if (n >= k) cout << n - k << endl;
    37     else cout << bfs(n, k) << endl;
    38     return 0;
    39 }
    作  者: Angel_Q 出  处:http://www.cnblogs.com/DA799422035/ 关于作者:如有问题或建议,请多多赐教! 版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。 特此声明:所有评论都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。 声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!
  • 相关阅读:
    小喵的在线共享编辑器
    简易漫画网站搭建-漫画喵Server版
    爬虫-漫画喵的100行逆袭
    应用OpenMP的一个简单的设计模式
    基于Caffe的Large Margin Softmax Loss的实现(中)
    基于Caffe的Large Margin Softmax Loss的实现(上)
    Oracle GoldenGate OGG管理员手册
    Spark快速大数据分析之RDD基础
    Apache Spark大数据分析入门(一)
    一文教你看懂大数据的技术生态圈:Hadoop,hive,spark
  • 原文地址:https://www.cnblogs.com/DA799422035/p/8955397.html
Copyright © 2011-2022 走看看