老题新解|矩阵转置
《信息学奥赛一本通》第 105 题:矩阵转置
题目描述
输入一个 nnn 行 mmm 列的矩阵 AAA,输出它的转置 ATA^TAT。
输入格式
第一行包含两个整数 nnn 和 mmm,表示矩阵 AAA 的行数和列数。1≤n≤1001 \le n \le 1001≤n≤100,1≤m≤1001 \le m \le 1001≤m≤100。
接下来 nnn 行,每行 mmm 个整数,表示矩阵 AAA 的元素。相邻两个整数之间用单个空格隔开,每个元素均在 1∼10001 \sim 10001∼1000 之间。
输出格式
mmm 行,每行 nnn 个整数,为矩阵 AAA 的转置。相邻两个整数之间用单个空格隔开。
输入输出样例 #1
输入 #1
3 3
1 2 3
4 5 6
7 8 9
输出 #1
1 4 7
2 5 8
3 6 9
大家好,我是莫小特。
这篇文章给大家带来《信息学奥赛一本通》中的一百零五题:矩阵转置。
一、题目描述
洛谷的题号是:B2106 矩阵转置
二、题意分析
这道题是信息学奥赛一本通练习题的第 105 题,主要考察二维数组的应用。
首先根据输入格式的描述,输入一行包括两个整数 n 和 m,代表矩阵的行数和列数,数据范围都在 100 以内,所以使用 int 类型。
int n,m;
cin>>n>>m;
特别提醒,一定要注意输入的顺序,n 在前 m 在后。
接下来要输入 n 行,每行有 m 个整数,代表矩阵 A 的元素,使用 for 循环即可实现。
for(int i=1;i<=n;i++)
{for(int j=1;j<=m;j++){}
}
这些数据因为都需要输出,因此需要一个数据结构来存储,根据题目的意思,选用二维数组最佳,所以定义一个二维数组,并使用嵌套 for 循环输入。
int a[110][110];
for(int i=1;i<=n;i++)
{for(int j=1;j<=m;j++){cin>>a[i][j];}
}
输入完成后,我们来分析题意,根据题目描述,要求输入矩阵之后,直接输出它的转置。
转置是线性代数的内容,如果不太熟悉,我们可以阅读样例输入和样例输出来分析什么是转置。
我们发现样例输入的数据在样例输出中发现了变化,即行变成了列,列变成了行。
也就相当于说,行变列,列变行,在二维数组的具体表现就是 n 行 m 列的数据转换成 m 行 n 列的数据,所以代码可以用写成下面这样,注意,原来的行变成了列,对应的数据变化一定要正确,原本的行是 n 行,转变成列也应该是 n 列。
输出时,也不要忘记加换行!
for(int j=1;j<=m;j++)//原本的列变成了行 在外层循环
{for(int i=1;i<=n;i++)//原本的行变成了列 在内层循环{cout<<a[i][j]<<" ";//输出数据 用空格分隔}cout<<endl;//不要忘记换行!
}
按样例输入对数据进行验证。
数据正确,提交到网站测评。
测试通过!
三、完整代码
该题的完整代码如下:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{int n,m;cin>>n>>m;int a[110][110];for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];}}for(int j=1;j<=m;j++)//原本的列变成了行 在外层循环{for(int i=1;i<=n;i++)//原本的行变成了列 在内层循环{cout<<a[i][j]<<" ";//输出数据 用空格分隔}cout<<endl;//不要忘记换行!}return 0;
}
四、总结
本题考察了二维数组的定义与应用,以及行列变换的输出逻辑,在解题过程中,有以下几点需要注意:
1、转置的理解
很多没学过线性代数的同学,可能不太了解转置是意思,可以通过阅读样例输入和样例输出来辅助理解,利用现有提示来理解会比查阅资料更加方便。
2、转置的实现
输出时将原矩阵的列作为外层循环,原行作为内层循环,即 for(j)
外层,for(i)
内层,完成矩阵转置的逻辑。
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我哦!
如果你有更好的方法,可以在评论区留言哦,一起进步~
我们下集见~