当前位置:首页 > 题解目录 > 正文内容

【题解】 二维数组转置

亿万年的星光2个月前 (12-14)题解目录305

说明

输入一个nm列的数组,输出他的转置,具体来说
输出的第i行第j个数字,应是输入的第
j行第i个数字。

1≤n≤20000;1≤m≤20000;1≤n∗m≤20000;1≤a[i][j]≤1000
特别注意,你并不能声明一个两维的大小都是20000二维数组。(数组不能太大,二维数组的大小是两维的乘积)
二维数组本质上和一维数组等价,所以你只需要一个大小为20000的一维数组。

输入格式

第一行两个整数nm表示数组的行数和列数;
接下来
n行,每行m个整数表示数组内容。

输出格式

第一行先输出mn。 接下来输出转置的结果,共mn列。 其中第i行第
j个数字,应是输入的第jj行第i个数字。

样例

输入数据 1

3 2
1 2
3 4
5 6

输出数据 1

2 3
1 3 5
2 4 6


【题目分析】

    如果是二维数组,那么可以按照下面的方式进行

#include<iostream>
using namespace std;
int main(){
	int n,m,a[100][100];
	cin>>n>>m;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cin>>a[i][j];
		}
	} 
	//输出
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			cout<<a[j][i]<<" ";
		}
		cout<<endl;
	}  
	return 0;
}

现在题目限制一维数组,其实计算机中没有二维数组的概念,是用一维数组模拟的二维数组,比如一个3*3的二维数组,我们显示成下面这样

3 5 6
2 3 1
7 3 0

如果用坐标表示这种关系,那么可以表示成下面这样:

行/列列 0列 1列 2
行 0356
行 1231
行 2730

展示成坐标就是下面这样:

行/列列 0列 1列 2
行 00,00,10,2
行 11,01,11,2
行 22,02,12,2


上面的数据可以用一维数组进行存储,我们使用“行优先”模式(也就是一行一行的),可以表示成这样


data[0][0] = 3 → 一维索引 0*3 + 0 = 0
data[0][1] = 5 → 索引 1
data[0][2] = 6 → 索引 2
data[1][0] = 2 → 索引 3
data[1][1] = 3 → 索引 4
data[1][2] = 1 → 索引 5
data[2][0] = 7 → 索引 6
data[2][1] = 3 → 索引 7
data[2][2] = 0 → 索引 8

结论就是:index= i*cols+j


如果是列优先,那么可以表示成这样:

data[0][0] = 3 → 索引 0*3 + 0 = 0
data[1][0] = 2 → 索引 1
data[2][0] = 7 → 索引 2
data[0][1] = 5 → 索引 3
data[1][1] = 3 → 索引 4
data[2][1] = 3 → 索引 5
data[0][2] = 6 → 索引 6
data[1][2] = 1 → 索引 7
data[2][2] = 0 → 索引 8

结论就是:index= j*rows+i


【参考答案】

#include <iostream>
using namespace std;
int a[20005]; 
int main() {
    int n, m;
    cin >> n >> m;
    // 读入数据,按行优先存储
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> a[i * m + j];
        }
    }
    // 输出转置后的行列数
    cout << m << " " << n << endl;
    // 输出转置矩阵
    for (int j = 0; j < m; j++) {        // 原始矩阵的列号,转置矩阵的行号
        for (int i = 0; i < n; i++) {    // 原始矩阵的行号,转置矩阵的列号
            cout << a[i * m + j];
            if (i < n - 1) cout << " ";  // 行内空格分隔
        }
        cout << endl;                    // 换行
    }
    return 0;
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

【题解目录】友好城市

【题解目录】友好城市

【题目描述】Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。每对友好城市都向政府申请在河...

【题解】河中跳房子

【题目描述】每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石。这项激动人心的活动在一条长长的笔直河道中进行,在起点和离起点L远 (1 ≤ L≤ 1,000,000,000...

【题解】放苹果(1)

【题目描述】把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。【输入】第一行是测试数据的数目t(0≤t≤20)。以下...

【题解】亲戚

【题目描述】若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是...

文具订购(NOI online入门组)

【题目描述】小明的班上共有n元班费,同学们准备使用班费集体购买3种物品。圆规,每个7元。笔,每支4元。笔记本,每本3元。小明负责订购文具,设圆规、笔、笔记本的订购数量为a,b,c,他订购的原则依次如下...

大象喝水

【题目描述】上课的时候老师问了小蒜蒜和同学们一个问题:一只大象口渴了,要喝 20 升水才能解渴,但现在只有一个深 h 厘米,底面半径为 r厘米的小圆桶...