uva-101 搬砖问题(不定长数组vector的使用)
题目大意:
输入n,得到编号为0~n-1的木块,分别摆放在顺序排列编号为0~n-1的位置。现对这些木块进行操作,操作分为四种。
1、move a onto b:把木块a、b上的木块放回各自的原位,再把a放到b上;
2、move a over b:把a上的木块放回各自的原位,再把a发到含b的堆上;
3、pile a onto b:把b上的木块放回各自的原位,再把a连同a上的木块移到b上;
4、pile a over b:把a连同a上木块移到含b的堆上。
当输入quit时,结束操作并输出0~n-1的位置上的木块情况
大神的代码:
#include <cstdio> #include <string> #include <vector> #include <iostream> using namespace std; const int maxn=30; int n; vector<int> pile[maxn]; //找到木块a,并用引用&返回结果 void find_block(int a,int& p,int& h){ for(p=0;p<n;p++) for(h=0;h<pile[p].size();h++) if(pile[p][h]==a)return; } void clear_above(int p,int h){ for(int i=1+h;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; cin>>n; string s1,s2; for(int i=0;i<n;i++)pile[i].push_back(i); while(cin>>s1){ if(s1=="quit")break; cin>>a>>s2>>b;//cin不吃空格 int pa,pb,ha,hb; find_block(a,pa,ha); find_block(b,pb,hb); if(pa==pb) continue; //非法指令 if(s2=="onto") clear_above(pb,hb); if(s1=="move") clear_above(pa,ha); pile_onto(pa,ha,pb); } print(); return 0; }
vector就是类似于一个数组的容器,内容比数组更加全面。很多操作都有自己的函数可以直接拿过来进行使用。主要函数就是:
v.push_back(k); 尾插元素;
v.insert(it,k); 在任意位置插入元素;
v.eraser(it,it+k); 删除任意元素;
v.size(); 容量;
v.clear(); 清空容器;
v.empty(); 判断容器是否为空;
reverse(v.begin(),v.end());反转任意段元素
sort(v.begin(),v.end(),cmp);sort排序默认由小到大,cmp可以自由规定排序规则。
此外,答案将四种指令抽象处理,只用了 clear_above,pile_onto两个动作来组合完成所有指令,减少了重复与冗长。
ps:提取问题之间的共同点,可以减少重复