uva 101

/*
  
	(栈)这里 有一个需要知道的  如果一个点走出了 原来的 位置 那么它最早的那个位置的  当他在回到原来位置的时候 可能还会有 块在那个下面 
  根据这点 我们就可以 大胆 的进行出栈入栈操作 
*/


#include <string.h>
#include <iostream>
#include <cstdio>
using namespace std;
int L[30],N[30][30],num[30],t1,t2,A,B,KH[30],n;
void dec(int er){
    int i,LOC=L[er];
	for(i=num[LOC];i>=1;i--){   if(N[LOC][i]==er) break; int d=N[LOC][i];  num[LOC]--;N[d][++num[d]]=d; L[d]=d;}
}
void pustt(int er,int to){
   int i,LOC=L[er];
   int LL=0;
   for(i=num[LOC];i>=1;i--){ 
	   int d=N[LOC][i]; 
            KH[++LL]=d;  
			L[d]=L[to];  
			num[LOC]-- ;  
			if(N[LOC][i]==er) break;  
   }
   LOC=L[to];
   while(LL!=0){
	   N[LOC][++num[LOC]]= KH[LL];
	   LL--; 
   }
}
void print(){
	for(int i=0;i<n;i++){
	   printf("%d:",i);
	   for(int j=1;j<=num[i];j++) printf(" %d",N[i][j]);
	   printf("\n");
	}
  
}
int main()
{
	int i;
	scanf("%d",&n);
	char str[100];
    memset(num,0,sizeof(num));
	memset(N,0,sizeof(N));
	memset(L,0,sizeof(L));
	for(i=0;i<n;i++){
	   L[i]=i;
	   N[i][++num[i]]=i;
	}
	while(scanf("%s",str)==1){
	  if(str[0]=='q')break;

	  if(str[0]=='m')t1=1;
	  else t1=2; 
	  scanf("%d%s%d",&A,str,&B);
       if(str[1]=='n')t2=1;
	   else t2=2;
	   if(A>=n||A<0||B>n||B<0||L[A]==L[B])continue;
	   if(t1==1&&t2==1){ dec(A);
	   dec(B); 
	   N[L[B]][++num[L[B]]]=A; num[L[A]]--;
	   L[A]=L[B]; 
	   }
	   if(t1==1&&t2==2){  dec(A);    N[L[B]][++num[L[B]]]=A; num[L[A]]--; L[A]=L[B];   }
	   if(t1==2&&t2==1){   dec(B);pustt(A,B);     }
	   if(t1==2&&t2==2){   pustt(A,B);          }
	
	}
       print();
   return 0;

}

posted @ 2014-03-09 20:26  来自大山深处的菜鸟  阅读(312)  评论(0编辑  收藏  举报