问题 F: 零基础学C/C++185——行列转换
题目描述
对于一个n*m的稀疏矩阵,按照行、列、值得格式读入K个元素(其他位置的值为0),再输出这些数
输入
第一行3个整数,表示n、m、k,每2个数之间用一个空格隔开
以下K行,按照“行优先(从上到下、从左到右)”的方式读入k个非0元素。每行3个数,依次为行号、列号、元素值,每2个数之间用一个空格隔开
输出
输出k个数,按照“列优先(从左到右,同一列的按照先输入的先输出)”的方式输出,每两个数之间用一个空格隔开
样例输入 Copy
4 5 3
1 2 12
1 4 23
4 3 45
样例输出 Copy
12 45 23
题解
我本人认为这道题自己描述的有问题,例如上述样例输入,如果1 4 23改成1 2 12,意思是在一个位置上重复,那么输出是几个数呢?这就是这道题最难的地方,同时我认为有问题的地方。
如果你认为输出2个数,为45 23,那么就错了,那就是你认为数据覆盖。
但是我对拍出来时输出3个数即12 45 23,再根据题目里的一句话“先输入的先输出”,也不难理解了
我认为就是题目没讲清楚
以下是错误代码
点击查看代码
#include<stdio.h>
#include<iostream>
using namespace std;
int a[1000][1000];
int main()
{
int n,m,k;
cin>>n>>m>>k;
int x,y,num;
for(int i=0;i<k;i++)
{
cin>>x>>y>>num;
a[x][y]=num;
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(a[j][i]!=0)
{
cout<<a[j][i]<<" ";
}
}
}
return 0;
}
正确代码以及理解
在知道了输入数据不是覆盖的之后,那我们该如何读入数据呢?如果是重复的位置,我们是不是还要再开一个数组???
那就有点麻烦了,仔细思考一下,我们能不能用结构体呢?同时满足了一个数据多个特性的输入,还能不覆盖输入,皆大欢喜。
点击查看代码
#include<algorithm>
using namespace std;
struct node
{
int hang;
int lie;
long long int value;
int num;
}a[1000];
bool cmp (node x,node y)
{
if(x.lie==y.lie)
{
return x.num<y.num;
}
else
{
return x.lie<y.lie;
}
}
int main()
{
int n,m,k;
scanf("%d %d %d" ,&n ,&m ,&k);
for(int i=0;i<k;i++)
{
scanf("%d %d %lld" ,&a[i].hang ,&a[i].lie ,&a[i].value);
a[i].num=i;
}
sort(a,a+k,cmp);
for(int i=0;i<k;i++)
{
printf("%lld",a[i].value);
if(i!=k-1)
{
printf(" ");
}
}
return 0;
}