http://acm.pku.edu.cn/JudgeOnline/problem?id=1208
Код:
#include <cstdio> #include <cstring> #include <vector> const int NMAX = 25; int block[NMAX+10][NMAX+10]; int bcnt[NMAX+10]; int place[NMAX+10]; int name2(char *o) { if(strcmp(o , "onto") == 0) return 1; else return 0; } void later_clear( int p ) { int t = place[p],q; int i,k; for(i=0;i<bcnt[t];i++){ if(block[t][i] == p){ k = i; break; } } for(i=bcnt[t]-1;i>k;i--){ q = block[t][i]; block[q][bcnt[q]++] = q; place[q] = q; block[t][--bcnt[t]] = 0; } } void search_pile( int p1 , int p2 ) { int t = place[p1], q; int i,k; for(i=0;i<bcnt[t];i++){ if(block[t][i] == p1){ k = i; break; } } q = place[p2]; for(i=k ; i < bcnt[t] ; i++){ block[q][bcnt[q]++] = block[t][i]; place[block[t][i]] = q; block[t][i] = 0; } bcnt[t] = k; } void Aruray_Mirgon() { int n,p1,p2,i,t,j; char s[10],o[10]; scanf("%d",&n); for(i=0;i<n;i++){ block[i][bcnt[i]] = i; place[i] = i; bcnt[i] = 1; } while(1) { scanf("%s",s); if(strcmp(s,"quit") == 0) break; scanf("%d %s %d",&p1,o,&p2); if(p1 == p2 || place[p1] == place[p2]) continue; if(strcmp(s,"move") == 0){ if( name2(o) ){ later_clear(p1); later_clear(p2); t = place[p1]; block[t][--bcnt[t]] = 0; t = place[p2]; block[t][bcnt[t]++] = p1; place[p1] = t; } else{ later_clear(p1); t = place[p1]; block[t][--bcnt[t]] = 0; t = place[p2]; block[t][bcnt[t]++] = p1; place[p1] = t; } } if(strcmp(s,"pile") == 0){ if( name2(o) ){ later_clear(p2); search_pile(p1,p2); } else{ search_pile(p1,p2); } } } for(i=0;i<n;i++) { printf("%d:",i ); for(j=0;j<bcnt[i];j++) printf(" %d",block[i][j]); printf("\n"); } } int main() { Aruray_Mirgon(); }