加载中...

浙江理工大学入队200题——17F

问题 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;
	
}

posted @ 2022-11-23 21:29  shany212  阅读(159)  评论(0编辑  收藏  举报