• UVa 101


    题目:给你n个方块,有四种操作:
    
                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所在堆的上面。
    
    分析:模拟,数据结构。观察操作,如果是move就是先把a上面的还原,如果是onto就是先把b上面的还原。
    
                然后,就是移动一堆到另一堆的上面(单个也认为是一堆)。所以设置两个基础操作:
    
                1.将a上面的还原init_place(a);
    
                2.将a和上面的(可以没有上面的)放到b上面pile_a_to_b(a,b)。
    
                那么上述的四组操作就变成下面了:
    
                1.move a onto b,init_place(a);init_place(b);pile_a_to_b(a,b);
    
                2.move a over b,init_place(a);pile_a_to_b(a,b);
    
                3.pile a onto b,init_place(b);pile_a_to_b(a,b);
    
                4.pile a over b,pile_a_to_b(a,b)。
    
                利用两个操作轻松解决。具体实现时设置一个place数组记录每个编号的方块对应的堆。
    
    注意:如果a和b已经在一堆中就不要操作,此时认为不用移动,否则会WA。

     ~~~~~~~~~~~~~抄对了.~~~~~~~然而并不懂 .

     1 #include<cstdio>
     2 #include<string>
     3 #include<vector>    //该头文件中的 vector   是一个不定长的数组
     4 #include<iostream>
     5 using namespace std;
     6 const int maxn=30;
     7 int  n;
     8 vector<int>pile[maxn];
     9 void find_block(int a,int& p,int& h)
    10 {
    11     for(p=0;p<n;p++)
    12     {
    13         for(h=0;h<pile[p].size();h++)     //从0 开始 遍历  看其是否  有等0之时 .
    14             if(pile[p][h]==a)
    15             return;
    16     }
    17 }
    18 void clear_above(int p,int h)
    19 {
    20     for(int i=h+1;i<pile[p].size();i++)
    21     {
    22         int b=pile[p][i];
    23         pile[b].push_back(b);
    24     }
    25     pile[p].resize(h+1);
    26 }
    27 void pile_onto(int p,int h,int p2)
    28 {
    29     for(int i=h;i<pile[p].size();i++)
    30         pile[p2].push_back(pile[p][i]);
    31     pile[p].resize(h);
    32 }
    33 void print()
    34 {
    35     for(int i=0;i<n;i++)
    36     {
    37         printf("%d:",i);
    38         for(int j=0;j<pile[i].size();j++)
    39             printf(" %d",pile[i][j]);
    40         printf("
    ");
    41     }
    42 }
    43 int main()
    44 {
    45     int a,b;
    46     scanf("%d",&n);
    47     string s1,s2;
    48     for(int i=0;i<n;i++)
    49         pile[i].push_back(i);
    50     while(cin>>s1>>a>>s2>>b)
    51     {
    52         int pa,pb,ha,hb;
    53         find_block(a,pa,ha);
    54         find_block(b,pb,hb);
    55         if(pa=pb)
    56             continue;
    57         if(s2=="onto")
    58             clear_above(pb,hb);
    59         if(s1=="move")
    60             clear_above(pa,ha);
    61         pile_onto(pa,ha,pb);
    62     }
    63     print();
    64     return 0;
    65 }
  • 相关阅读:
    composer
    brew转为国内源
    轻松生成一个golang的docker应用程序
    轻松生成一个vue的静态nginx
    【OS_Windows】windows server设置多用户可同时远程连接
    【OS_Linux】centos中查看已有用户信息
    【OS_Linux】查看Linux系统版本的命令
    【OS_Linux】借助终端Xshell实现Centos文件的上传与下载
    【OS_Linux】终端XShell的安装与使用
    【OS_Linux】VMware 中安装CentOS7
  • 原文地址:https://www.cnblogs.com/A-FM/p/5169715.html
Copyright © 2020-2023  润新知