CCF 10.稀疏矩阵快速转置
【问题描述】
稀疏矩阵的存储不宜用二维数组存储每个元素,那样的话会浪费很多的存储空间。所以可以使用一个一维数组存储其中的非零元素。这个一维数组的元素类型是一个三元组,由非零元素在该稀疏矩阵中的位置(行号和列号对)以及该元组的值构成。而矩阵转置就是将矩阵行和列上的元素对换。
请你实现一个快速的对稀疏矩阵进行转置的算法。
【输入形式】
输入的第一行是两个整数r和c(r<200, c<200, r*c <= 12500),分别表示一个包含很多0的稀疏矩阵的行数和列数。接下来有r行,每行有c个整数,用空格隔开,表示这个稀疏矩阵的各个元素。
【输出形式】
输出为读入的稀疏矩阵的转置矩阵。输出共有c行,每行有r个整数,每个整数后输出一个空格。请注意行尾输出换行。
【样例输入】
6 7
0 12 9 0 0 0 0
0 0 0 0 0 0 0
-3 0 0 0 0 14 0
0 0 24 0 0 0 0
0 18 0 0 0 0 0
15 0 0 -7 0 0 0
【样例输出】
0 0 -3 0 0 15
12 0 0 0 18 0
9 0 0 24 0 0
0 0 0 0 0 -7
0 0 0 0 0 0
0 0 14 0 0 0
0 0 0 0 0 0
C++实现:
#include<iostream>
#include<stdio.h>
using namespace std;
#define MAXSIZE 20000
int num[MAXSIZE+1],cpot[MAXSIZE+1];
typedef struct
{
int row,col;
int e;//该非零元素的值
}Triple;
typedef struct
{
Triple data[MAXSIZE+1];//非零元素的三元组表
int m,n,len;//矩阵的行数,列数和非零元的个数
}TSMatrix;
TSMatrix FastTransposeTSMatrix(TSMatrix A,TSMatrix B);
TSMatrix CreatSMatrix(TSMatrix A);
TSMatrix CreatSMatrix(TSMatrix A)
{
int p,q,k,a;
A.len=0,k=1;
for( p=1;p<=A.m;p++)
for( q=1;q<=A.n;q++)
{
cin>>a;
if(a!=0)
{
A.data[k].row=p;
A.data[k].col=q;
A.data[k].e=a;
k++;
A.len++;
}
}
return A;
}
TSMatrix FastTransposeTSMatrix(TSMatrix A,TSMatrix B)
{
int col,t,p,q;
int num[MAXSIZE],position[MAXSIZE];
B.len=A.len;B.n=A.m;B.m=A.n;
if(B.len)
{
for(col=1;col<=A.n;col++)
num[col]=0;
for(t=1;t<=A.len;t++)
num[A.data[t].col]++;
position[1]=1;
for(col=2;col<=A.n;col++)
position[col]=position[col-1]+num[col-1];
for(p=1;p<=A.len;p++)
{
col=A.data[p].col; q=position[col];
B.data[q].row=A.data[p].col;
B.data[q].col=A.data[p].row;
B.data[q].e=A.data[p].e;
position[col]++;
}
}
return B;
}
int main()
{
int k=1,p,q;
TSMatrix A,B;
cin>>A.m>>A.n;
A=CreatSMatrix(A);
B=FastTransposeTSMatrix(A,B);
for(p=1;p<=B.m;p++)
{
for(q=1;q<=B.n;q++)
{
if(B.data[k].row==p&&B.data[k].col==q)
{
cout<<B.data[k].e<<" ";
k++;
}
else
cout<<"0 ";
}
cout<<endl;
}
return 0;
}