刘汝佳上的题目。
1 #include <cstdio> 2 #include <vector> 3 #include <iostream> 4 using namespace std; 5 vector<int> pile[25]; 6 void find(const int n,int aim, int& b, int& g) { 7 for(b=0;b<n;b++) 8 for(g=0;g<pile[b].size();g++) if(pile[b][g] == aim) return; 9 } 10 void moveonto(int ab,int ag,int bb,int bg){ 11 //归位a 12 for(int i=ag+1;i<pile[ab].size();i++){ 13 int num=pile[ab][i]; 14 pile[num].push_back(num); 15 }pile[ab].resize(ag+1); 16 17 //归位b 18 for(int i=bg+1;i<pile[bb].size();i++){ 19 int num=pile[bb][i]; 20 pile[num].push_back(num); 21 }pile[bb].resize(bg+1); 22 23 //放置a 24 pile[bb].push_back( pile[ab][ag] ); 25 26 //删去a 27 pile[ab].resize(ag); 28 } 29 void moveover(int ab,int ag,int bb,int bg){ 30 //归位a 31 for(int i=ag+1;i<pile[ab].size();i++){ 32 int num=pile[ab][i]; 33 pile[num].push_back(num); 34 }pile[ab].resize(ag+1); 35 36 //放置a 37 pile[bb].push_back( pile[ab][ag] ); 38 39 //删去a 40 pile[ab].resize(ag); 41 } 42 void pileonto(int ab,int ag,int bb,int bg){ 43 //归位b 44 for(int i=bg+1;i<pile[bb].size();i++){ 45 int num=pile[bb][i]; 46 pile[num].push_back(num); 47 }pile[bb].resize(bg+1); 48 49 //放置a 50 for(int i=ag;i<pile[ab].size();i++){ 51 pile[bb].push_back( pile[ab][i] ); 52 }pile[ab].resize(ag); 53 } 54 void pileover(int ab,int ag,int bb,int bg){ 55 //放置a 56 for(int i=ag;i<pile[ab].size();i++){ 57 pile[bb].push_back( pile[ab][i] ); 58 }pile[ab].resize(ag); 59 } 60 int main(){ 61 int a,b,n; 62 scanf("%d",&n); 63 string s1, s2; 64 for(int i = 0; i < n; i++) pile[i].push_back(i); 65 while(cin>>s1 && s1!="quit") { 66 cin>>a>>s2>>b; 67 int ab, ag, bb, bg; 68 find(n,a,ab,ag);find(n,b,bb,bg); 69 if(ab==bb) continue; 70 if(s1=="move" && s2=="onto") moveonto(ab,ag,bb,bg); 71 if(s1=="move" && s2=="over") moveover(ab,ag,bb,bg); 72 if(s1=="pile" && s2=="onto") pileonto(ab,ag,bb,bg); 73 if(s1=="pile" && s2=="over") pileover(ab,ag,bb,bg); 74 } 75 for(int i=0;i<n;i++){ 76 printf("%d:",i); 77 for(int j=0;j<pile[i].size();j++) printf(" %d",pile[i][j]); 78 printf(" "); 79 } 80 }
刘汝佳书上的做法明显更加精简……不过刚学STL……老老实实的把四种行为做出来比较靠谱……