73 稀疏矩阵
问题描述 :
今天明明学到了什么叫做矩阵,但他发现要将一个矩阵输入进电脑是一件很麻烦的事。特别是有些矩阵很大,且大部分元素都是0,我们称这类矩阵为稀疏矩阵。 于是,明明发明了一种简单的表示方法,只指出矩阵中非零元素来表示该矩阵。
例如一个矩阵:
0 0 0 5
2 0 0 0
0 1 0 0
0 0 4 0
可以表示成:
1 4 5
2 1 2
3 2 1
4 3 4
但明明又开始力不从心了,于是再一次想到了你...
明明的问题可以归结为:试编程将一个稀疏矩阵a转换成只存放非零元素的矩阵b,即找出每个不是0的元素,按从左到右从上到下的顺序,输出其所在的行和列以及它的值。
输入说明 :
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。
每组数据的第一行包括两个整数,M和N,用空格隔开,表示矩阵大小为M * N(1 ≤ M, N ≤ 20),之后的M行每行有N个整数,也用空格隔开,整数的大小不会超出int型,且必有一个数非零。行首行尾没有空格,每组测试数据之间也没有多余空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。对应每组输入数据,用明明的矩阵表示法输出该矩阵,即找出每个不是0的元素,按从左到右从上到下的顺序,输出其所在的行和列(行、列下标从1开始)以及它的值。其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果后面没有空行。 注:通常,显示屏为标准输出设备。
输入范例 :
4 4
0 0 0 5
2 0 0 0
0 1 0 0
0 0 4 0
2 1
1
1
输出范例 :
1 4 5
2 1 2
3 2 1
4 3 4
1 1 1
2 1 1
思想:遍历到不为0的,相关信息存起来,最后输出就好
#include <stdio.h> #include <stdlib.h> #include <math.h> int max(int a,int b){ if(a>b){ return a; }else{ return b; } } int main() { int row,col,i,j,k,count; while(scanf("%d %d",&row,&col)!=EOF){ count = 0; int array[row][col]; int rows[row]; int cols[row]; int value[row]; for(i=0;i<row;i++){ for(j=0;j<col;j++){ scanf("%d",&array[i][j]); if(array[i][j]!=0){ rows[count] = i+1; cols[count] = j+1; value[count] = array[i][j]; count++; } } } for(k = 0;k<count;k++){ printf("%d %d %d\n",rows[k],cols[k],value[k]); } printf("\n"); } }