http://acm.pku.edu.cn/JudgeOnline/problem?id=1208

http://acm.pku.edu.cn/JudgeOnline/images/1208_1.jpg

Код:
#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();
}