题目描述
矩阵转置就是把原矩阵A的所有元素aij转成矩阵B的bji。 现实中,大部分的矩阵都是稀疏的,所以,存储矩阵时,我们可以只存储存储每个非零元素的坐标和值,并且按行优先排序。 比如说3×3矩阵
0 1 0 0 2 3 0 0 0其转置矩阵为
0 0 0 1 2 0 0 3 0上面矩阵使用稀疏矩阵的存储方法存(i,j,aij)为
0 1 1 1 1 2 1 2 3其转置矩阵
1 0 1 1 1 2 2 1 3输入
第一行是一个整数T,(0<T≤10),表示样例的数目。
每个样例的第一行是三个整数N,M,K,1≤N,M≤1000,1≤K≤10000,分别表示矩阵的行数,列数,非零元素个数。
以后的K行,每行三个整数X,Y,V,0≤X<N,0≤Y<M,−100≤V≤100,表示元素的行,列,值。
数据保证输入元素的顺序按行优先有序。输出
输出每个样例的结果,每个样例输出之后有一个空行。
样例输入
2 3 3 3 0 1 1 1 1 2 1 2 3 1 3 1 0 0 1样例输出
1 0 1 1 1 2 2 1 3 0 0 1
解题思路: 用结构体保存矩阵的 <X,Y,V>,并在输入的时候,直接对矩阵的(X,Y)进行转置。然后因为要按 行优先顺序输出,所以对结构体进行排序处理,最后直接输出。
AC代码:
#include <stdio.h>
#include <stdlib.h>
struct matrix{
int X,Y,V;
}Matrix[10010];
int cmp(const void *p1,const void *p2){ // 结构体排序函数
if (((matrix *)p1)->X != ((matrix *)p2)->X) // 如果 p1,p2 的X不相等, 按X的大小排序
return ((matrix *)p1)->X - ((matrix *)p2)->X;
return ((matrix *)p1)->Y - ((matrix *)p2)->Y; // 如果 p1,p2 的X 相等, 按Y的大小排序
}
int main()
{
int T,N,M,K;
scanf("%d",&T);
while (T --)
{
scanf("%d %d %d",&N,&M,&K);
for (int t = 0; t < K; t ++) // 输入的时候就直接对X,Y 位置调换
scanf("%d %d %d",&Matrix[t].Y,&Matrix[t].X,&Matrix[t].V);
qsort(Matrix,K,sizeof(Matrix[0]),cmp);
for (int t = 0; t < K; t ++)
printf("%d %d %d\n",Matrix[t].X, Matrix[t].Y, Matrix[t].V);
puts("");
}
return 0;
}