http://poj.org/problem?id=1208
晚点仔细看
https://blog.csdn.net/yxz8102/article/details/53098575
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<stdlib.h> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #include<string> 10 #define mem(a) memset(a,0,sizeof(a)) 11 using namespace std; 12 const long long N=1e9+5; 13 #define LL long long 14 vector<int> pile[30]; 15 int n; 16 17 //查找木块a所在的pile和height 18 void find_block(int a,int &p,int &h) //引用,相当于直接用实参 19 { 20 for(p=0;p<n;p++) 21 { 22 for(h=0;h<pile[p].size();h++) 23 { 24 if(pile[p][h]==a) return; 25 //vector就像一个二维数组,只是第一维大小固定(30),二维大小不固定。 26 } 27 } 28 } 29 //把p堆高度为h的木块上方所有的木块移回原位置 30 void clear_above(int p,int h) 31 { 32 for(int i=h+1;i<pile[p].size();i++) 33 { 34 int t=pile[p][i]; 35 pile[t].push_back(t); ////把标号为t的木块放回原位,即t堆 36 } 37 pile[p].resize(h+1); //重新定义p堆的长度 38 } 39 //把p堆高度为h及其上方的木块整体移到p2的得尾部 40 void pile_onto(int p,int h,int p2) 41 { 42 for(int i=h;i<pile[p].size();i++) 43 pile[p2].push_back(pile[p][i]); //?? 44 pile[p].resize(h); 45 } 46 void print() 47 { 48 for(int i=0;i<n;i++) 49 { 50 printf("%d:",i); 51 for(int j=0;j<pile[i].size();j++) 52 { 53 printf(" %d",pile[i][j]); 54 } 55 printf(" "); 56 } 57 } 58 int main() 59 { 60 int a,b; 61 scanf("%d",&n); 62 string s1,s2; 63 for(int i=0;i<n;i++) 64 { 65 pile[i].push_back(i); 66 } 67 while(cin>>s1) 68 { 69 if (s1=="quit") break; 70 cin>>a>>s2>>b; 71 int pa,pb,ha,hb; 72 find_block(a,pa,ha); 73 find_block(b,pb,hb); 74 if(pa==pb) continue; 75 if(s2=="onto") clear_above(pb,hb); 76 if(s1=="move") clear_above(pa,ha); 77 pile_onto(pa,ha,pb); 78 } 79 print(); 80 return 0; 81 }