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 }

 

你可能感兴趣的:(vector)