UVA 101

刘汝佳上的题目。

 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……老老实实的把四种行为做出来比较靠谱……

原文地址:https://www.cnblogs.com/dilthey/p/6804186.html