【题解】 二维数组转置
说明
输入一个行列的数组,输出他的转置,具体来说
输出的第行第个数字,应是输入的第j行第个数字。
1≤n≤20000;1≤m≤20000;1≤n∗m≤20000;1≤a[i][j]≤1000
特别注意,你并不能声明一个两维的大小都是二维数组。(数组不能太大,二维数组的大小是两维的乘积)
二维数组本质上和一维数组等价,所以你只需要一个大小为的一维数组。
输入格式
第一行两个整数, 表示数组的行数和列数;
接下来n行,每行个整数表示数组内容。
输出格式
第一行先输出, 。 接下来输出转置的结果,共行列。 其中第行第j个数字,应是输入的第j行第个数字。
样例
输入数据 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 |
|---|---|---|---|
| 行 0 | 3 | 5 | 6 |
| 行 1 | 2 | 3 | 1 |
| 行 2 | 7 | 3 | 0 |
展示成坐标就是下面这样:
| 行/列 | 列 0 | 列 1 | 列 2 |
|---|---|---|---|
| 行 0 | 0,0 | 0,1 | 0,2 |
| 行 1 | 1,0 | 1,1 | 1,2 |
| 行 2 | 2,0 | 2,1 | 2,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;
}扫描二维码推送至手机访问。
版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。
