UVA 101
题意:四种操作把a和b所在的数字移动。
lrj的思想很好。首先找到共同点。然后不必写四种操作。其次理解vector的方便。
#include<iostream> #include<cstdio> #include<vector> using namespace std; const int maxn = 30; int n; vector<int>pile[maxn]; void find_back(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 = 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); } int main() { //freopen("in.txt","r",stdin); int a,b; cin>>n; string s1,s2; for(int i = 0;i < n; i++) pile[i].push_back(i); while(cin>>s1>>a>>s2>>b){ int pa,ha,pb,hb; find_back(a,pa,ha); find_back(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); } 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"); } return 0; }

浙公网安备 33010602011771号