UVa 101 - The Blocks Problem STL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 101 - The Blocks Problem STL相关的知识,希望对你有一定的参考价值。

题目:给你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("\n");
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 }

 

以上是关于UVa 101 - The Blocks Problem STL的主要内容,如果未能解决你的问题,请参考以下文章

UVa 101 - The Blocks Problem STL

UVA101 The Blocks Problem

E - The Blocks Problem ( UVA - 101)

木块问题 The Blocks Problem, UVa 101

STL:Vector 例题:UVA 101(积木问题) The Blocks Problem

uvaoj 101 - The Blocks Problem(vector应用+技巧)