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 }

 

posted @ 2015-06-30 15:24  jasaiq  阅读(274)  评论(0编辑  收藏  举报