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();
}