题目描述
矩阵转置
在这里补充一种改变原数组的方法,不同于直接在原数组上直接输出
通过交换的思想解决:
注意一个细节:
for (int j=i+1;j<n;++j)
{
int t=a[i][j];
a[i][j]=a[j][i];
a[j][i]=t;
}
j=i+1,注意这个条件
他代表在每一次循环时,前i个已经排好了不用在交换了.
以a[3][3]为例:
1 2 3
4 5 6
7 8 9
第一次外层循环时:我们知道a[0][0]是不用动的,所以第0个不用交换,从第一个开始,即a[0][1]和a[1][0]交换,a[0][2]与a[2][0]交换.同时我们知道交换之后就不用再次交换了.
第二次外层循环时:应该从第1(这里指下标,下同)个开始,因为a[1][1]不用交换,只用a[1][2]与a[2][1]交换,同时a[2][1]此时也已经交换好,不用再次交换.
第三次外层循环时:从第2个开始,这时j=3,已经不满足内层循环条件,并且a[2][2]也已经排好.
退出循环.
算法1
(暴力枚举) $O(n^2)$
时间复杂度
(n^2)
C++ 代码
#include<iostream>
using namespace std;
const int N=1e2+10;
int n;
int a[N][N];
int cnt;
void convert(int a[][N],int n)
{
for (int i=0;i<n;++i)
for (int j=i+1;j<n;++j)
{
int t=a[i][j];
a[i][j]=a[j][i];
a[j][i]=t;
}
}
int main()
{
scanf("%d",&n);
for (int i=0;i<n;++i)
for (int j=0;j<n;++j) scanf("%d",&a[i][j]);
convert(a,n);
for (int i=0;i<n;++i)
for (int j=0;j<n;++j)
{
cnt++;
printf("%d ",a[i][j]);
if (cnt==n)
{
printf("\n");
cnt=0;
}
}
return 0;
}