行列转换问题(动态数组解法)
【问题描述】
矩阵可以认为是N*M的二维数组。现在有一个巨大但稀疏的矩阵。
N,M范围是:1<N,M≤100000,有K个位置有数据,K的范围是:1≤K
<100000。
矩阵输入的方式是从上到下(第1行到第N行)、从左到右(从第1列到第M列)扫描,
己录有数据的坐标位置(x,y)和值(v)。这是按照行优先的方式保存数据的。现在要求按照
列优先的方式输出数据,即从左到右、从上到下扫描,输出有数据的坐标和数值。 优先
【输入格式】
第1行,3个整数N,M,K,其中1≤N,M,K≤10000;下面有K行,每行3个整数:
a,b,c,表示第a行第b列有数据c。数据在int范围内,保证是行优先的次序。
【输出格式】
1行,K个整数,是按照列优先次序输出的数。
【样列输入】
4 5 9
1 2 12
1 4 23
2 2 56
2 5 78
3 2 100
3 4 56
4 1 73
4 3 34
4 5 55
【样列输出】
73 12 56 100 34 23 56 78 55
【思路】
直接建立二维数组肯定不行(不够大),所以利用动态数组,动态申请空间,然后按列存入再输出。
原文链接:https://blog.csdn.net/weixin_46191137/article/details/115802825
《信息学奥赛一本通》 p157
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int n,m,k;
int x[N],y[N],d[N],c[N];
int*a[N];
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=k;i++)
{
scanf("%d%d%d",&x[i],&y[i],&d[i]);
c[y[i]]++;
}
for(int i=1;i<=m;i++) a[i]=new int[c[i]];
for(int i=1;i<=k;i++)
{
*a[y[i]]=d[i];
a[y[i]]++;
}
for(int i=1;i<=m;i++)
{
a[i]-=c[i];
for(int j=1;j<=c[i];j++)
{
printf("%d ",*a[i]);
a[i]++;
}
}
}