CCF 稀疏矩阵快速转置

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;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值