#include <stdio.h>
#include <stdlib.h>
#define N 6
#define MAX 20
typedef int ElemType;
typedef struct{
    int i,j;
    ElemType e;
}Triple;
typedef struct{
    Triple data[MAX];
    int mu,nu,tu;
}TSMatrix;
void reverse(ElemType a[][N],TSMatrix *M);
void fastTransposeSMatrix(TSMatrix *M,TSMatrix *T);
//将稀疏矩阵转换为三元组顺序表存储
void reverse(ElemType a[][N],TSMatrix *M){
   int x=0,y=0,s=0;
   M->mu=N;
   M->nu=N;
   M->tu=0;
   for(x=0;x<N;x++)
   {
   	    for(y=0;y<N;y++)
   	    {
   	    	if(a[x][y]!=0)
   	    	{
   	    		M->data[s].e=a[x][y];
   	    		M->tu++;
   	    		M->data[s].i=x;
   	    		M->data[s++].j=y;
			}
		}
   }
}
//快速方法实现三元组顺序表表示的矩阵M转置为T
void fastTransposeSMatrix(TSMatrix *M,TSMatrix *T){
    int col,p,q,t,num[MAX],cpot[MAX],i;
    T->mu=M->nu;
    T->nu=M->mu;
    T->tu=M->tu;
    if(T->tu)
    {
    	for(col=0;col<M->nu;col++)
    	num[col]=0;
    	for(t=0;t<M->tu;t++)
    	num[M->data[t].j]++;
    	cpot[0]=0;
    	for(col=1;col<M->nu;col++)
    	cpot[col]=cpot[col-1]+num[col-1];
    printf("num\n");
	for(i=0;i<N;i++)
	{
		printf("%d ",num[i]);
	}
	printf("\n");
	printf("cpot\n");
	for(i=0;i<N;i++)
	{
		printf("%d ",cpot[i]);
	}
	printf("\n");
    	for(p=0;p<M->tu;p++)
    	{
    		col=M->data[p].j;
    		q=cpot[col];
    		T->data[q].i=M->data[p].j;
    		T->data[q].j=M->data[p].i;
    		T->data[q].e=M->data[p].e;
    		cpot[col]++;
		}
	}
}
int main(){
    int a[N][N];
    TSMatrix T,M;
    int i,j;
    for (i=0; i<N; i++){
        for(j=0; j<N; j++)
            scanf("%d",&a[i][j]);
    }
    reverse(a,&M);
    printf("M\n");
    printf("%d %d %d\n",M.mu,M.nu,M.tu);
    for (i=0;i<M.tu;i++)
        printf("%d %d %d\n",M.data[i].i,M.data[i].j,M.data[i].e);
    fastTransposeSMatrix(&M,&T);
    printf("T\n");
    printf("%d %d %d\n",T.mu,T.nu,T.tu);
    for (i=0;i<T.tu;i++)
        printf("%d %d %d\n",T.data[i].i,T.data[i].j,T.data[i].e);
    return 1;
}