您的位置:首页 > 理论基础 > 数据结构算法

3347-数据结构实验之数组三:快速转置

2017-08-22 18:10 260 查看

数据结构实验之数组三:快速转置

Problem Description

转置运算是一种最简单的矩阵运算,对于一个m*n的矩阵M( 1 = < m < = 10000,1 = < n < = 10000 ),它的转置矩阵T是一个n*m的矩阵,且T( i , j )=M( j , i )。显然,一个稀疏矩阵的转置仍然是稀疏矩阵。你的任务是对给定一个m*n的稀疏矩阵( m , n < = 10000 ),求该矩阵的转置矩阵并输出。矩阵M和转置后的矩阵T如下图示例所示。

稀疏矩阵M

0 14 0 0 -5

0 -7 0 0 0

36 0 0 28 0

稀疏矩阵T

0 0 36

14 -7 0

0 0 0

0 0 28

-5 0 0

Input

连续输入多组数据,每组数据的第一行是三个整数mu, nu, tu(tu <= 50),分别表示稀疏矩阵的行数、列数和矩阵中非零元素的个数,随后tu行输入稀疏矩阵的非零元素所在的行、列值和非零元素的值,同一行数据之间用空格间隔。(矩阵以行序为主序)

Output

输出转置后的稀疏矩阵的三元组顺序表表示。

Example Input

3 5 5

1 2 14

1 5 -5

2 2 -7

3 1 36

3 4 28

Example Output

1 3 36

2 1 14

2 2 -7

4 3 28

5 1 -5

起初,我做这个题目和做《3348-数据结构实验之数组二:稀疏矩阵》时的做法一样,用了二维数组,先把非零元素存起来,然后转换后输出,这样做交上去也是超时

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node
{
int a,b,c;
}s[11111],t;
int main()
{
int mu,nu,tu;
int i,j,k;
while(scanf("%d %d %d",&mu,&nu,&tu)!=EOF)
{
for(i=1;i<=tu;i++)
scanf("%d%d %d",&s[i].a,&s[i].b,&s[i].c);
for(i=1;i<tu;i++)
{
for(j=i+1;j<=tu;j++)
{

4000
if(s[i].b>s[j].b)//把列按照从小到大的顺序排列
{
t=s[j];
s[j]=s[i];
s[i]=t;
}
if(s[i].b==s[j].b)//在列相同的情况下
{
if(s[i].a>s[j].a)//把行按照从小到大的顺序排列
{
t=s[j];
s[j]=s[i];
s[i]=t;
}
}
}
}
for(i=1;i<=tu;i++)
printf("%d %d %d\n",s[i].b,s[i].a,s[i].c);//按照先输出列再输出行再输出元素的格式输出
}
return 0;
}


用结构体数组来存放输入的行、列、非零元素

并且把列按 从小到大的顺序排序,在列相同的情况下,把行按从小到大的顺序排序,然后再按照先输出行再输出列再输出元素。

超时代吗

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int vis[10001][10001];
int main()
{
int mu,nu,tu;
int i,j,k;
int p,q,s;
memset(vis,0,sizeof(vis));
while(scanf("%d %d%d",&mu,&nu,&tu))
{
for(i=1;i<=tu;i++)
{
scanf("%d %d %d",&p,&q,&s);
vis[p][q]=s;
}
for(i=1;i<=nu;i++)
{
for(j=1;j<=mu;j++)
{
if(vis[j][i]!=0)//输出时行列转换
printf("%d %d %d\n",i,j,vis[j][i]);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: