矩阵旋转

一.摘要

  做题已经遇到很多矩阵旋转的题了,如果一个一个看还是不知道该怎么找规律,这里介绍一种个人觉得比较简便的方法。

二.步骤

  原矩阵和顺时针旋转90°、180°和270°(逆时针90°)如下:

1.如果你一个一个去分析,列出它们元素的坐标,还是比较难找到规律的,而且还非常麻烦。首先,矩阵旋转,我们可以知道的是,整个旋转,并不会改变元素之间的相对位置,原矩阵的某一行、某一列,旋转之后还是一样的,只是它们可能在旋转之后在原矩阵中由一行变成了一列,由一列变成了一行,比如上图的原矩阵中“1 2 3 4”这一行,在旋转90°之后变成了一列,而“1 5 9 13”这一列,在旋转90°之后变成了一行。由上面所得,我们找旋转的规律,并不需要一个个元素去分析。下面以分析旋转90°为例

2.选择原矩阵中的任意一行,比如“1 2 3 4”,观察可知它在新矩阵中是变成了列,因此新矩阵的 列标 是旧矩阵的 行标的关系式 ,再任选其中一个元素,比如选 “1” ,它在原矩阵的行标 i 是0,在新矩阵的列标 n-1 (n是矩阵的阶数),可得新矩阵的列标是 n-1-i ;

3.选择原矩阵中的任意一列,比如“1 5 9 13”,观察可知它在新矩阵中是变成了行,因此新矩阵的 行标 是旧矩阵的 行标的关系式 ,再任选其中一个元素,比如选 “1” ,它在原矩阵的列标 j 是0,在新矩阵的行标 0 (n是矩阵的阶数),可得新矩阵的行标是 j ;

4.由上面分析得到新矩阵的行列的坐标是 (j,n-1-i) ,其他的旋转角度分析一样(虽然可以使用几次旋转90°得到结果,但是这样无疑是增加了耗时)。

三.代码

1.示例代码

 1 /**矩阵顺时针旋转90°*/
 2 #include<iostream>
 3 using namespace std;
 4 void zhuan90(int n,int m_old[][105],int m_new[][105]){
 5     for(int i=0;i<n;i++)
 6         for(int j=0;j<n;j++)
 7             m_new[j][n-1-i]=m_old[i][j];
 8 }
 9 int main() {
10     int m_old[105][105],m_new[105][105];
11     int n;
12     cin>>n;
13     for(int i=0;i<n;i++)
14         for(int j=0;j<n;j++)
15             cin>>m_old[i][j];
16     zhuan90(n,m_old,m_new);
17     cout<<"new:"<<endl;
18     for(int i=0;i<n;i++){
19         for(int j=0;j<n;j++)
20             cout<<m_new[i][j]<<"	";
21         cout<<endl;
22     }
23     return 0;
24 }

2.运行结果

原文地址:https://www.cnblogs.com/chasemeng/p/13208584.html