101 - The Blocks Problem

  1 #include<iostream>
  2 #include<string>
  3 using namespace std;
  4 int n;
  5 int block[25][25];
  6 int top[25];
  7 string str;
  8 void num(int index,int &a,int &b)
  9 {
 10     a=0,b=0;
 11     int i=5;
 12     while(i<=index-2)
 13     a=str[i++]-'0'+a*10;
 14     index=index+5;
 15     while(str[index]!='\0')
 16     b=str[index++]-'0'+b*10;
 17 }
 18 void find(int value,int &x,int &y)
 19 {
 20     for(int i=0;i<n;i++)
 21     for(int j=0;j<=top[i];j++)
 22     if(block[i][j]==value)
 23     {
 24         x=i;
 25         y=j;
 26         break;
 27     }
 28 }
 29 void move_onto(int a,int b)
 30 {
 31     int xa,ya,i;
 32     find(a,xa,ya);
 33     int xb,yb;
 34     find(b,xb,yb);
 35     if(xa==xb)
 36         return;
 37     for(i=ya+1;i<=top[xa];i++)
 38     {
 39         int index=block[xa][i];
 40         top[index]++;
 41         block[index][top[index]]=index;
 42     }
 43     top[xa]=ya-1;
 44     for(i=yb+1;i<=top[xb];i++)
 45     {
 46         int index=block[xb][i];
 47         top[index]++;
 48         block[index][top[index]]=index;
 49     }
 50     top[xb]=yb;
 51     block[xb][yb+1]=a;
 52     top[xb]++;
 53 }
 54 void move_over(int a,int b)
 55 {
 56     int xa,ya;
 57     find(a,xa,ya);
 58     int xb,yb;
 59     find(b,xb,yb);
 60     if(xa==xb)
 61     return;
 62     for(int i=ya+1;i<=top[xa];i++)
 63     {
 64         int index=block[xa][i];
 65         top[index]++;
 66         block[index][top[index]]=index;
 67     }
 68     top[xa]=ya-1;
 69      block[xb][top[xb]+1]=a;
 70      top[xb]++;
 71 }
 72 void pile_onto(int a,int b)
 73 {
 74     int xb,yb,i;
 75     find(b,xb,yb);
 76     int xa,ya;
 77     find(a,xa,ya);
 78     if(xa==xb)
 79         return;
 80     for(i=yb+1;i<=top[xb];i++)
 81     {
 82         int index=block[xb][i];
 83         top[index]++;
 84         block[index][top[index]]=index;
 85     }
 86     top[xb]=yb;
 87     for(i=ya;i<=top[xa];i++)
 88     {
 89     top[xb]++;
 90     block[xb][top[xb]]=block[xa][i];
 91     }
 92     top[xa]=ya-1;
 93 }
 94 void pile_over(int a,int b)
 95 {
 96     int xb,yb;
 97     find(b,xb,yb);
 98     int xa,ya;
 99     find(a,xa,ya);
100     if(xa==xb)
101       return;
102    for(int i=ya;i<=top[xa];i++)
103     {
104         top[xb]++;
105         block[xb][top[xb]]=block[xa][i];
106     }
107    top[xa]=ya-1;
108 }
109 int main()
110 {
111     while(cin>>n)
112     {
113         int i;
114         for(i=0;i<n;i++)
115             for(int j=0;j<n;j++)
116                 block[i][j]=-1;
117         for(i=0;i<n;i++)
118             block[i][0]=i;
119         for(i=0;i<n;i++)
120             top[i]=0;
121         getchar();
122 
123         while(getline(cin,str))
124         {
125             if(!str.compare("quit"))
126                break;
127             else 
128             {
129                 int a,b,index=0;
130                 if(!str.compare(0,4,"move"))
131                 {
132                     if(str.find("onto")!=string::npos)
133                     {
134                           index=str.find("onto");
135                           num(index,a,b);
136                           move_onto(a,b);
137                     }
138                     else
139                     {
140                         index=str.find("over");
141                         num(index,a,b);
142                         move_over(a,b);
143                     }
144                 }
145                 else
146                 {
147                     if(str.find("onto")!=string::npos)
148                     {
149                         index=str.find("onto");
150                         num(index,a,b);
151                         pile_onto(a,b);
152                     }
153                     else
154                     {
155                         index=str.find("over");
156                         num(index,a,b);
157                         pile_over(a,b);
158                     }
159                 }
160             }    
161             getchar();
162         }
163            for(i=0;i<n;i++)
164             {
165                 cout<<i<<": ";
166                for(int j=0;j<=top[i];j++)
167                    cout<<block[i][j]<<" ";
168                cout<<endl;
169             }
170     }
171     return 0;
172 }

 

posted @ 2013-03-30 23:59  sooflow  阅读(108)  评论(0)    收藏  举报