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 }