zoukankan      html  css  js  c++  java
  • Uva 101 -- the block problem

    Uva 101 the block problem

    题目大意:

    输入n,得到编号为0~n-1的木块,分别摆放在顺序排列编号为0~n-1的位置。现对这些木块进行操作,操作分为四种。

    1、move a onto b:把木块a、b上的木块放回各自的原位,再把a放到b上;

    2、move a over b:把a上的木块放回各自的原位,再把a发到含b的堆上;

    3、pile a onto b:把b上的木块放回各自的原位,再把a连同a上的木块移到b上;

    4、pile a over b:把a连同a上木块移到含b的堆上。

    当输入quit时,结束操作并输出0~n-1的位置上的木块情况

     

    Sample Input 
    10
    move 9 onto 1
    move 8 over 1
    move 7 over 1
    move 6 over 1
    pile 8 over 6
    pile 8 over 5
    move 2 over 1
    move 4 over 9
    quit
    Sample Output 
     0: 0
     1: 1 9 2 4
     2:
     3: 3
     4:
     5: 5 8 7 6
     6:
     7:
     8:
     9:

       学习使用vector

      vector就是一个不定长数组。

      size()大小

      resize()改变大小

      push_back()向尾部添加元素

      pop_back()删除最后一个元素

      empty()测试是否为空

      clear()清空

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<string>
     4 #include<vector>
     5 using namespace std;
     6 const int maxn = 30;
     7 int n;
     8 vector<int> pile[maxn];
     9 ///找木块a所在的pile块和height,以引用的形式返回
    10 void find_block(int a,int &p,int &h)
    11 {
    12     for(p = 0;p < n;p++)
    13         for(h=0;h<pile[p].size();h++)
    14             if(pile[p][h] == a) return;
    15 }
    16 ///把第p维度高度为h的木块上方的所有木块移回原位
    17 void clear_above(int p,int h)
    18 {
    19     for(int i=h+1;i<pile[p].size();i++){
    20         int b = pile[p][i];
    21         pile[b].push_back(b);//把木块b放回原位
    22     }
    23         pile[p].resize(h+1);//pile只保留下标为0~h的元素
    24 }
    25 //把第p堆高度为h及其上方的木块整体移到p2堆的顶部
    26 void pile_onto(int p,int h,int p2)
    27 {
    28     for(int i=h;i<pile[p].size();i++)
    29         pile[p2].push_back(pile[p][i]);
    30     pile[p].resize(h);
    31 }
    32 void print()
    33 {
    34     for(int i = 0;i<n;i++)
    35     {
    36         cout<<i<<":";
    37         for(int j = 0;j<pile[i].size();j++)
    38             cout<<" "<<pile[i][j];
    39         cout<<endl;
    40     }
    41 }
    42 int main()
    43 {
    44     int a,b;
    45     cin>>n;
    46     string s1,s2;
    47     for(int i = 0;i<n;i++)
    48     {
    49         pile[i].push_back(i);
    50     }
    51     while(cin>>s1 && s1 != "quit"){
    52         cin>>a>>s2>>b;
    53         int pa,pb,ha,hb;
    54         find_block(a,pa,ha);
    55         find_block(b,pb,hb);
    56         if(pa == pb) continue;//非法指令
    57         if(s2 == "onto") clear_above(pb,hb);
    58         if(s1 == "move") clear_above(pa,ha);
    59         pile_onto(pa,ha,pb);
    60     }
    61     print();
    62     return 0;
    63 }
  • 相关阅读:
    Qt图片显示
    C# 对话框使用整理
    C# AutoResetEvent 使用整理
    C++ 模板
    superset使用
    superset部署
    kafka修改topic副本数
    c# 生成自定义图片
    c# 解决Randoms伪随机重复问题
    c# 图片加水印
  • 原文地址:https://www.cnblogs.com/yxh-amysear/p/8426381.html
Copyright © 2011-2022 走看看