zoukankan      html  css  js  c++  java
  • Problem B The Blocks Problem(vector的使用)

    题目链接:Problem B

    题意:有n块木块,编号为0~n-1,要求模拟以下4种操作(下面的a和b都是木块编号)

    1. move a onto b: 把a和b上方的木块全部归位,然后把a摞在b上面。

    2. move a over b: 把a上方的木块全部归位,然后把a放在b所在木块堆的顶部。

    3. pile a onto b: 把b上方的木块全部归位,然后把a及上面的木块整体摞在b上面。

    4. pile a over b: 把a及上面的木块整体摞在b所在木块堆的顶部。

    遇到quit时终止一组数据,忽略非法指令。

    思路:每个木块堆都用一个vector来维护,move操作都要对a归位,onto操作都要对b归位可以一起处理,四种操作最后都是把a及以上的摞在b的顶上,只不过前两种a上面的为空。

    note:
    1、resize(n) 
    调整容器的长度大小,使其能容纳n个元素。
    如果n小于容器的当前的size,则删除多出来的元素。
    否则,添加采用值初始化的元素。
    2、 resize(n, t)
    多一个参数t,将所有新添加的元素初始化为t。

    code:

     1 #include <iostream>
     2 #include <string>
     3 #include <vector>
     4 using namespace std;
     5 const int MAXN = 30;
     6 vector<int> pile[MAXN];
     7 int n;
     8 
     9 void findBlock(int a, int& p, int& h)
    10 {
    11     for (p = 0; p < n; ++p)
    12     {
    13         for (h = 0; h < pile[p].size(); ++h)
    14         {
    15             if (pile[p][h] == a)
    16                 return;
    17         }
    18     }
    19 }
    20 
    21 void clearAbove(int p, int h)
    22 {
    23     for (int i = h + 1; i < pile[p].size(); ++i)
    24     {
    25         int b = pile[p][i];
    26         pile[b].push_back(b);
    27     }
    28     pile[p].resize(h + 1);
    29 }
    30 
    31 void pileOnto(int pa, int ha, int pb)
    32 {
    33     for (int i = ha; i < pile[pa].size(); ++i)
    34         pile[pb].push_back(pile[pa][i]);
    35     pile[pa].resize(ha);
    36 }
    37 
    38 int main()
    39 {
    40     cin >> n;
    41     for (int i = 0; i < n; ++i) pile[i].push_back(i);
    42     int a, b;
    43     string s1, s2;
    44     while (cin >> s1)
    45     {
    46         if (s1 == "quit") break;
    47         cin >> a >> s2 >> b;
    48         int pa, pb, ha, hb;
    49         findBlock(a, pa, ha);
    50         findBlock(b, pb, hb);
    51         if (pa == pb) continue;
    52         if ("move" == s1) clearAbove(pa, ha);
    53         if ("onto" == s2) clearAbove(pb, hb);
    54         pileOnto(pa, ha, pb);
    55     }
    56     for (int i = 0; i < n; ++i)
    57     {
    58         cout << i << ":";
    59         for (int j = 0; j < pile[i].size(); ++j)
    60             cout << " " << pile[i][j];
    61         cout << endl;
    62     }
    63     return 0;
    64 }
  • 相关阅读:
    Linux问题分析或解决_samba无法连接
    Android系统编译环境及连接工具配置
    Linux问题分析或解决_ssh无法连接
    新能力| 云开发静态网站托管能力正式上线
    如何在云开发静态托管中使用Hugo
    如何在云开发静态托管绑定静态域名
    3步搞定图像盲水印?试试云开发扩展能力
    不再忍受龟速 Github,你也可以试试在云开发上部署个人博客!
    云开发 For Web:一站式开发下一代 Serverless Web 应用
    下笔如有神的程序员来教你写作啦!
  • 原文地址:https://www.cnblogs.com/ykzou/p/4610571.html
Copyright © 2011-2022 走看看