旋转矩阵,顾名思义就是从外到内一圈一圈旋转的矩阵。他的形式可以像这样

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;
}