#include<iostream>
using namespace std;
#define maxsize 34
class Node
{
public:
int i;//非零元素的行值
int j;//非零元素的列值
int v;//非零元素的值
};
class Sparmatrix
{
public:
int rows,cols;//行,列
int terms;//稀疏矩阵的非零元素
Node data[maxsize];//三元组表
void transpose( Sparmatrix a,Sparmatrix b);//转置
void fasttrans( Sparmatrix a,Sparmatrix b);//快速转置
};
void Sparmatrix::transpose(Sparmatrix a,Sparmatrix b)
{
a.rows=b.cols;
b.cols=a.rows;
b.terms=a.terms;
if(b.terms>0)
{
int bno=0;
for(int col=0;col<=cols;col++)//按列号转置
for(int ano=0;ano<=a.terms;ano++)
if(a.data[ano].j==col) //进行转置
{
b.data[bno].j=a.data[ano].i;
b.data[bno].i=a.data[ano].j;
b.data[bno].v=a.data[ano].v;
bno++;
}
}
for(int i=1;i<=a.terms;i++)
{
cout<<b.data[i].i<<"" ""<<b.data[i].j<<" "<<b.data[i].v<<endl;
}
}
void Sparmatrix::fasttrans(Sparmatrix a, Sparmatrix b)
{
int pot[100],col,ano,bno,t;
b.rows=a.cols; b.cols=a.rows;
b.terms=a.terms;
if(b.terms>0)
{
for(col=0;col<=a.cols;col++)//按列号转置
pot[col]=0;
for( t=0;t<a.terms;t++)//求出每一列的非零元素的个数
{
col=a.data[t];
pot[col+1]=pot[col+1]+1;
}
pot[0]=0;
for( col=0;col<=a.cols;col++)//求出每一列的非零元素的转置的位置
pot[col]=pot[col-1]+pot[col];
for(ano=0;ano<=a.terms;ano++)
{
col=a.data[t].j;
bno=pot[col];
b.data[bno].j=a.data[ano].i;
b.data[bno].i=a.data[ano].j;
b.data[bno].v=a.data[ano].v;
pot[col]=pot[col]+1;
}
}
for(int i=1;i<=a.terms;i++)
{
cout<<b.data[i].i<<"" ""<<b.data[i].j<<" "<<b.data[i].v<<endl;
}
}
void main()
{
Sparmatrix a,b;
cin>>a.rows;//输入稀疏矩阵的行
cin>>a.cols;//输入稀疏矩阵的列
cin>>a.terms;//输入稀疏矩阵的非零元素的值
for(int i=0;i<a.terms;i++)//进入循环,输入行,列,值
{
cin>>a.data[i].i;
cin>>a.data[i].j;
cin>>a.data[i].v;
}
for(int i=1;i<=a.terms;i++)
{
cout<<b.data[i].i<<"" ""<<b.data[i].j<<" "<<b.data[i].v<<endl;
}
a.transpose(a,b);
a.fasttrans(a,b);
}