这道题呢是需要在原矩阵上旋转,所以我们只能用一个temp来交换位置,那么我们用n=4的这个矩阵来推理
我们从5开始,可以发现5换到了11的位置,11换到了16的位置,16换到了15的位置,15换到了5的位置。即:
5-->11
11-->16
16-->15
15-->5
所以每次旋转就是4个数字在交换,交换值很容易,用一个temp就可以
但是我们要找出4个数字的坐标关系
我们取更具代表性的13-->1 12->13 10-->12 1-->10来举例
然后我们把这4个数的坐标写出
1: m[0][1] 13:m[2][0] 12:m[3][2] 10:m[1][3]
还是很难看出规律 再取2-->9 14-->2 7-->14 9-->7 写出坐标
9:m[0][2] 2:m[1][0] 14:[3][1] 7:m[2][3]
可以发现第1个数和第3个数,第2个数和第4个数对称。即x相加等于3,y相加等于3,第2个数的y是第1 个数的x,第2个数的x加第1 个数的y等于3
所以4个数的坐标依次为m[i][j] m[(n-1)-j][i] m[(n-1)-i][(n-1)-j] m[(n-1)-((n-1)-j)][(n-1)-i]=m[j][(n-1)-i]
最后一个问题就是怎么循环?
n=3时
当i=0,j=0,1
当i=1时,j=1 已经遍历了
n=4时
当i=0时 j=0,1,2
当i=1时 j=1,2 已经遍历了
n=5时
当i=0时 j=0,1,2,3
当i=1时 j=1,2 ,3
当i=2时 j=2 已经遍历了
可以发现i<n/2, j从i开始取,j<n-i-1结束 代码如下
void rotate(int** matrix, int matrixSize, int* matrixColSize){
for(int i=0;i<matrixSize/2;i++){
for(int j=i;j<matrixSize-i-1;j++){
int temp=matrix[i][j];
matrix[i][j]=matrix[matrixSize-1-j][i];
matrix[matrixSize-j-1][i]=matrix[matrixSize-i-1][matrixSize-j-1];
matrix[matrixSize-i-1][matrixSize-j-1]=matrix[j][matrixSize-1-i];
matrix[j][matrixSize-1-i]=temp;
}
}