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 }

 

转载于:https://www.cnblogs.com/ykzou/p/4610571.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值