uvaoj 101

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=835&page=show_problem&problem=37

木块问题,模拟堆的操作。每个堆的高度不确定,用vector来做很合适(vector动态)。

本题模拟四个操作:

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所在木块堆的顶部。

这里有一个技巧:四种指令完全独立处理会使代码变得复杂,容易出错。所以可以提取出他们之间的共同点,以减少重复代码。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=30;
 4 int n;
 5 vector<int> pile[maxn];//每个pile[i]是一个vector 
 6 //找木块a所在的pile和height,以引用的形式返回调用者 
 7 void find_block(int a,int& p,int& h)
 8 {
 9     for(p=0;p<n;p++)
10     {
11         for(h=0;h<pile[p].size();h++)
12         {
13             if(pile[p][h]==a)return;
14         }
15     }
16 }
17 //第P堆高度为h的木块上方的所有木块移回原位
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);//第p堆只保留下标在0~h之间的元素 
26 }
27 //把第p堆高度为h及其上方的木块整体移动到p2堆 
28 void pile_onto(int p,int h,int p2)
29 {
30     for(int i=h;i<pile[p].size();i++)
31     {
32         pile[p2].push_back(pile[p][i]);
33     }
34     pile[p].resize(h);//第p堆只保留下标在0~h-1之间的元素 
35 }
36 //打印函数 
37 void print()
38 {
39     for(int i=0;i<n;i++)
40     {
41         printf("%d:",i);
42         for(int j=0;j<pile[i].size();j++)printf(" %d",pile[i][j]);
43         printf("
");
44     }
45 }
46 int main()
47 {
48     int a,b;
49     cin>>n;
50     string s1,s2;
51     for(int i=0;i<n;i++)pile[i].push_back(i);//初始化,给木块赋上相应对的编号 
52     while(cin>>s1)
53     {
54         if(s1!="quit")cin>>a>>s2>>b;
55         else break;
56         int pa,pb,ha,hb;
57         find_block(a,pa,ha);
58         find_block(b,pb,hb);
59         if(pa==pb)continue;
60         if(s2=="onto")clear_above(pb,hb);
61         if(s1=="move")clear_above(pa,ha);
62         pile_onto(pa,ha,pb);
63     }
64     print();
65     return 0;
66 }
原文地址:https://www.cnblogs.com/fqfzs/p/9957271.html