输入一个 n×m 的整型数组,采用三元组压缩存储该数组,以每个整数按照两个字节存放计算原始数组和压缩存储后三元组所需存储空间大小。
1、输入n和m,中间以逗号分隔。
2、输入 n×m 数组元素,中间以一个空格分隔。
3、打印压缩后的三元组。
4、打印压缩前后的所需存储空间。
例如:
【输入】
6,10
0 1 0 2 0 0 0 0 5 0
3 0 0 0 0 0 0 9 0 0
0 0 0 0 0 6 0 0 0 0
8 0 0 0 0 0 0 0 3 0
0 0 0 0 0 0 0 0 0 0
0 0 0 7 0 0 0 0 0 0
【输出】
array[0,1]=1
array[0,3]=2
array[0,8]=5
array[1,0]=3
array[1,7]=9
array[2,5]=6
array[3,0]=8
array[3,8]=3
array[5,3]=7
Original array need 120 bytes.
The space needs 54 bytes after compress.
#include <stdio.h>
#define MAXSIZE 100
typedef struct{ //三元组结构体
int i, j; //该非零元的行下标和列下标
int e;
}Triple;
typedef struct{ //矩阵的结构表示
Triple data[MAXSIZE + 1]; //存储该矩阵中所有非0元素的三元组,data[0]未用
int mu, nu, tu; //矩阵的行数,列数和非零元个数
}TSMatrix;
int main() {
TSMatrix M;
int a, b;
int array[MAXSIZE][MAXSIZE];
int t = 0;
scanf("%d,%d", &M.mu, &M.nu);
for(a = 0; a < M.mu; a++)
for(b = 0; b < M.nu; b++)
scanf("%d", &array[a][b]);
for(a = 0; a < M.mu; a++)
for(b = 0; b < M.nu; b++){
if(array[a][b] != 0){
M.data[t].e = array[a][b];
M.data[t].i = a;
M.data[t].j = b;
t = t + 1;
}
}
for(a = 0; a < t; a++)
printf("array[%d,%d]=%d\n", M.data[a].i, M.data[a].j, M.data[a].e);
printf("Original array need %d bytes.\n", M.mu * M.nu * 2);
printf("The space needs %d bytes after compress.\n", t * 3 * 2);
return 0;
}