zoukankan      html  css  js  c++  java
  • 矩阵旋转

    一.摘要

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

    二.步骤

      原矩阵和顺时针旋转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.运行结果

  • 相关阅读:
    洛谷 P3850 [TJOI2007]书架
    洛谷 P2073 送花
    洛谷 P2343 宝石管理系统
    浅谈 fhq-treap(无旋treap)
    洛谷 P4568 [JLOI2011]飞行路线
    洛谷 T59576 下一个回文树(zhoutbafo)
    求SG函数(两种方法)
    python3+Appium自动化08-数据配置yaml
    python3+Appium自动化07-滑动操作以及滑动方法封装
    python3+Appium自动化06-屏幕截图
  • 原文地址:https://www.cnblogs.com/chasemeng/p/13208584.html
Copyright © 2011-2022 走看看