【行列转换问题】(动态数组)

  • Post author:
  • Post category:其他


行列转换问题(动态数组解法)

【问题描述】

矩阵可以认为是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]++;
        }
    }
}



版权声明:本文为weixin_73739312原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。