2903: 【例64.1】 二维数组转置

内存限制:64 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:4 解决:3

题目描述

输入一个$n$行$m$列的数组,输出他的转置,具体来说
输出的第$i$行第$j$个数字,应是输入的第$j$行第$i$个数字。
$1 \le n \le 20000,1 \le m \le 20000,1 \le n * m \le 20000,1 \le a[i][j] \le 1000$
特别注意,你并不能声明一个两维的大小都是$20000$二维数组。(数组不能太大,二维数组的大小是两维的乘积)
二维数组本质上和一维数组等价,所以你只需要一个大小为$20000$的一维数组。

输入

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

输出

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

样例输入 复制

3 2
1 2
3 4
5 6

样例输出 复制

2 3
1 3 5
2 4 6

提示

#include<bits/stdc++.h>
using namespace std;
int a[20005],n,m;
int main(){
    cin>>n>>m;
    for(int i=0;i<n*m;i++) cin>>a[i];
    cout<<m<<' '<<n<<endl;
    for(int j=0;j<m;j++){
        for(int i=0;i<n;i++) cout<<a[i*m+j]<<' ';
        cout<<endl;
    }
    return 0;
}

#include<bits/stdc++.h>
using namespace std;
int x,n,m;
vector<int> a[20001];
int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++)
    for(int j=0;j<m;j++){
        cin>>x;
        a[i].push_back(x);
    }
    cout<<m<<' '<<n<<endl;
    for(int j=0;j<m;j++){
        for(int i=0;i<n;i++) cout<<a[i][j]<<' ';
            cout<<endl;
    }
    return 0;
}