例题5-2 木块问题(The Blocks Problem,Uva 101)
从左到右有n个木块,编号为0~n-1,要求模拟以下4种操作(下面的a和b都是木块编 号)。
move a onto b:把a和b上方的木块全部归位,然后把a摞在b上面。
move a over b:把a上方的木块全部归位,然后把a放在b所在木块堆的顶部。
pile a onto b:把b上方的木块全部归位,然后把a及上面的木块整体摞在b上面。
pile a over b:把a及上面的木块整体摞在b所在木块堆的顶部。
遇到quit时终止一组数据。a和b在同一堆的指令是非法指令,应当忽略。
#include<bits/stdc++.h> using namespace std; vector<int>pile[25]; int n; void find_block(int a,int& p,int &h) { for(p = 0;p < n;p++) { for(h = 0;h < pile[p].size();h++) if(a == pile[p][h]) return; } } void clear_block(int p,int h) { for(int i = h + 1;i < pile[p].size();i++) { int b = pile[p][i]; pile[b].push_back(b); } pile[p].resize(h + 1); } void pile_onto(int p,int h,int p2) { for(int i = h;i < pile[p].size();i++) { pile[p2].push_back(pile[p][i]); } pile[p].resize(h); } void print() { for(int i = 0;i < n;i++) { printf("%d:",i); for(int j = 0;j < pile[i].size();j++) { printf(" %d",pile[i][j]); } printf("\n"); } } int main() { int a, b, pa, pb, ha, hb; string s1, s2; cin >> n; for(int i = 0; i < n;i++) { pile[i].push_back(i); } while(cin >> s1 >> a >> s2 >> b && s1 != "quit") { find_block(a, pa, ha); find_block(b, pb, hb); if(pa == pb) continue; if(s1 == "move") clear_block(pa, ha); if(s2 == "onto") clear_block(pb, hb); pile_onto(pa, ha, pb); } print(); return 0; }
vector<int>a[maxn] 相当于一个二维数组 只是y轴是可变的
调用 a[i].push_back(x); a[i].resize(x);