题目描述
稀疏矩阵的存储不宜用二维数组存储每个元素,那样的话会浪费很多的存储空间。所以可以使用一个一维数组存储其中的非零元素。这个一维数组的元素类型是一个三元组,由非零元素在该稀疏矩阵中的位置(行号和列号对)以及该元组的值构成。
矩阵转置就是将矩阵行和列上的元素对换。
现在就请你对一个稀疏矩阵进行转置。以下是稀疏矩阵转置的算法描述:
图:稀疏矩阵转置的算法描述
输入格式
输入的第一行是两个整数r和c(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
以下算法是我个人想出来的:
思想:
用一个函数把稀疏矩阵录入到一个结构体数组
---------------------------
数组下标 0 1 2 3 5
----------------------------------
行号 3 0 0 2 2
列号 3 1 2 0 1
元素(数据) 4 9 7 2 3
------------------------------
第0个单元用来存储稀疏矩阵的信息:行号-稀疏矩阵的行数, 列号-稀疏矩阵的列数, 元素-稀疏矩阵的非零元素个数这样子得到一个结构体数组就是按行号排列的数组利用自己写的cmp算法跟sort结合很容易实现把结构体数组排序成按列号排列的数组,然后用一个输出函数实现稀疏矩阵的输出
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct em //稀疏矩阵的元素结构
{
int row, col;
int data;
};
em ema[12500]; //稀疏矩阵存放的结构体数组
void input(int row, int col) //录入数据到结构体数组
{
int i, j, temp;
int count = 1; //控制结构体数组下表兼统计非零元素个数
ema[0].row = row; //ema【0】用来存放矩阵的行,列,非零元素个数
ema[0].col = col;
for (i=0; i<row; i++)
{
for (j=0; j<col; j++)
{
if (scanf("%d", &temp), temp) //非零元素就录入到结构体数组
{
ema[count].row = i;
ema[count].col = j;
ema[count++].data = temp;
}
}
}
ema[0].data = count-1;
}
bool cmp(em emax, em emay) //sort函数的cmp算法,按列升序,再到行升序排序
{
if (emax.col != emay.col) return emax.col < emay.col;
if (emax.row != emay.row) return emax.row < emay.row;
}
void output() //输出函数,根据结构体数组输出矩阵
{
int i, j;
int count = 1;
for (i=0; i<ema[0].col; i++)
{
for (j=0; j<ema[0].row; j++)
{
if (i == ema[count].col && j == ema[count].row) //在非零元素位置输出对应的元素
{
printf("%d ", ema[count].data);
count++;
}
else //否则输出零
{
printf("0 ");
}
}
printf("\n");
}
}
int main()
{
int i, j, temp; //行,列下标控制,临时存放
int row, col; //行号,列号
scanf("%d %d", &row, &col);
input(row, col); //录入矩阵
sort(ema+1, ema+ema[0].data+1,cmp); //排序
output(); //输出矩阵
system("PAUSE");
return 0;
}