青少年编程知识记录 codecoming

【题解】 二维数组转置

说明

输入一个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;  }



作者:亿万年的星光 分类:题解目录 浏览: