旋转矩阵的构造和螺旋三角阵的构造
旋转矩阵,顾名思义就是从外到内一圈一圈旋转的矩阵。他的形式可以像这样
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
也可以像这样
25 24 23 22 21
10 9 8 7 20
11 2 1 6 19
12 3 4 5 18
13 14 15 16 17
那么如何构造一个旋转矩阵呢?思想是先求出 row行 column列的矩阵有多少个元素,max = row * column;用 l( left )代表没填得的最左边是第几列,r( right )代表没填得的最右边是第几列。u( up )代表没填得的最上面边是第几行,d( down )代表没填得的最下面边是第几行。
然后从u行的第l列开始填数,直到填到r列。代表没填的最上面一行填完了,u++代表没填的最上一行往下移一行。然后从r列的第u行开始填数,直到填到d行。代表没填的最右边一列填完,r–代表没填的最右一列往左移一列。(注意:这儿从第u行开始填是正确的,因为在这之前u已经向下移了一行了,后面的也是一样的。每次填数前 l r u d 构成的矩阵都是没填过的,可以自己画矩阵图来理解)。
然后从d行的第r列开始填数,直到填到l列。代表没填的最下面一行填完了,d–代表没填的最下一行往上移一行。然后从l列的第d行开始填数,直到填到u行。代表没填的最左边一列填完,l++代表没填的最左一列往右移一列。
不断循环,直到最大值减为0。代表max =row * column 个数填完了。矩阵的构造结束
#include<iostream>using std::endl;
using std::cin;
using std::cout;int main(){int num[20][20];int row, column;cout << "请输入想要构造的矩阵的行数和列数(行在前,列在后):"; //一般旋转矩阵都是方阵,也可以构造不是方阵的cin >> row >> column;int max = row * column;int l = 0, r=column-1, u = 0, d=row-1;while (max > 0) {for (int i = l; (i <= r) && (max > 0); i++) {num[u][i] = max--;}u++;for (int i = u; (i <= d) && (max > 0); i++) {num[i][r] = max--;}r--;for (int i = r; (i >= l) && (max > 0); i--) {num[d][i] = max--;}d--;for (int i = d; (i >= u) && (max > 0); i--) {num[i][l] = max--;}l++;}
//到这儿就完成构建了,num这个二维数组现在是旋转数组了for (int i = 0; i < row; i++) {for (int j = 0; j < column-1; j++) {cout << num[i][j] << ' ';}cout << num[i][column-1] << endl;}return 0;
}
-----------------------2020.6.15更新分割线----------------------------------
为啥更新,做剑指offer19题时想到这个旋转矩阵。剑指offer 19、顺时针打印矩阵 python c++
-----------------------2020.6.15更新分割线----------------------------------
学会了构建旋转矩阵,那么如何构造一个螺旋三角阵呢,它长这样
1 2 3 4 5 6 7 8 9 10
27 28 29 30 31 32 33 34 11
26 45 46 47 48 49 35 12
25 44 54 55 50 36 13
24 43 53 51 37 14
23 42 52 38 15
22 41 39 16
21 40 17
20 18
19
思想和旋转矩阵构造类似,按着思路理一遍就可以了。注意点是这儿的 r 和d 合并了。直接上代码。
#include<iostream>using std::endl;
using std::cin;
using std::cout;int main(){int num[20][20];int row;while(cin >> row){int max = (row * (row+1))/2, min=1;int l = 0, u = 0, d = row - 1;while (max >= min) {for (int i = l; (i <= d) && (max >= min); i++) {num[u][i] = min++;}u++;for (int i = u,j = 1; (i <= d) && (max >= min); i++,j++) {num[i][d-j] = min++;}d--;for (int i = d; (i >= u) && (max >= min); i--) {num[i][l] = min++;}d--;l++;}for (int i = 0; i < row; i++) {for (int j = 0; j < row-i-1; j++) {cout << num[i][j] << ' ';}cout << num[i][row-i-1] << endl;}}return 0;
}
旋转矩阵的构造和螺旋三角阵的构造相关推荐
- MATLAB矩阵变换--三角阵
MATLAB 矩阵变换-三角阵 上三角阵 下三角阵 上三角阵是指矩阵的对角线以下的元素全为0的一种矩阵,下三角阵是指矩阵的对角线以上的元素全为0的一种矩阵. 上三角阵:求矩阵A的上三角阵的MATLAB ...
- 【数据结构】随堂练习设有一个 n 阶的下三角矩阵 A ,如果按照行的顺序将下三角 阵中的元素包括对角线上元素)存放在 n ( n +1)/2个连续的存储单元中,则 A [ i][j ]与 A [ 0]
1.必答[单选题] 设有一个二维数组 A [m][ n ],按行优先存储在连续的单元中.假设 A [0] [0]存放位置在644, A [2][2]存放位置在676,每个元素占一个空间,问 A [3] ...
- 子类构造与析构时,父类构造与析构机制
子类构造与析构时,父类构造与析构机制1 构造子类对象时,先调用父类构造函数,再调用子类构造函数(构造函数没有虚函数这一说法) 析构子类对象时,先调用子类的析构函数,再调用父类析构函数(无论父类的析构函 ...
- 数组10——数组的压缩存储2——上三角阵的压缩存储
编写一个算法,将一个以行为主序存储的一维数组转换为以列为主序压缩存储的一维数组.例如,设有n×n的上三角矩阵A的上三角元素已按行为主序连续存放在数组b中,请设计一个算法Trans将b中元素按列为主序存 ...
- oracle logfile sync,oracle等待事件3构造一个DirectPathwrite等待事件和构造一个LogFileSync等待事件...
第一篇<oracle等待事件1分别用表和索引上数据的访问来产生dbfilescatteredread等待事件>http://leonarding.blog.51cto.com/604552 ...
- java if 局部变量_java – 为什么局部变量在if-else构造中启动而在if-else-if构造中不启动?...
所以我们知道必须初始化局部变量才能在if-else-if构造中使用. 例如,以下代码将无法编译. public class Test { public static void main (String ...
- 正规文法构造状态转换图,状态转换图构造正规文法---编译原理
从左线性正规文法出发,构造状态图 注意:增设初态S,单圆圈表示 例子 从右线性正规文法出发,构造状态图 注意:增设终态Z,双圆圈表示 例子 状态转换图构造左线性正规文法 注意:写左线性正规文法时从终态 ...
- c语言最优树的构造,哈夫曼树的构造及编码 Haffman树的构造及其编码
写出构造完整的哈夫曼树的编码 void HuffmanCoding(HuffmanCode HC[], int w[], int n) // w存放n个字符的权值(均>0),构造哈夫曼树HT, ...
- 子集构造法和含有空串的子集构造法
子集构造法 子集构造法很简单. 消除空转移子集构造法 Design 闭包是自己+接受空串能到达的状态. DFA的开始状态时NFA的闭包 3.识别的语言:(a+c+e)(a+c+e)b+(a+c+e) ...
最新文章
- Guava学习笔记:缘起
- JavaScript 面向对象 (prototype 原型模式)
- LA4851餐厅(求好的坐标的个数)
- 使用MONGODB 集群的OPLOG 日志进行数据恢复
- 2核4g服务器选啥系统好,云服务器2核4g可以做什么
- linux sed 1的意思,linux命令(1):sed命令
- Filecoin网络目前总质押量约为4110万枚FIL
- 金山毒霸免费Wifi独立版,只需一块无线网卡,完爆360随身wifi
- 如何使用powerdesigner导出sql脚本
- 统计调查制度申请流程和申请书公文模板
- matlab整数规划分支计算,分支定界法求线性整数规划
- 解决Oracle安装过程中出现的缺少KEY_XE.reg文件的问题
- 2019年,北上广等一线城市的IT岗位饱和了么?
- 代码随想录第二天 leetcode 977、209、59
- find grep联合搜索
- Vivado仿真报错合集(更新中)
- 英语口译笔记法实战指导 吴钟明 pdf_2019.05 CATTI备考经验:二级口译实务经验 | 从口译小白到入门...
- 那位学软件测试的广州宝妈,后来怎样了?
- ASP.NET Cache的一些总结
- C++ 10 翁恺> 继承