矩阵旋转
一.摘要
做题已经遇到很多矩阵旋转的题了,如果一个一个看还是不知道该怎么找规律,这里介绍一种个人觉得比较简便的方法。
二.步骤
原矩阵和顺时针旋转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]<<"\t"; 21 cout<<endl; 22 } 23 return 0; 24 }
2.运行结果
分类:
数据结构与算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现