旋转矩阵,顾名思义就是从外到内一圈一圈旋转的矩阵。他的形式可以像这样
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;
}