n X n的矩阵,以图片中心为原点,考虑到:
第一象限的点全移到第二象限,第二象限的点全移到弟三象限,依次类推。
每个点的移动位置是确定的,每四个点构成一个循环。
当n为奇数:半轴长a=n/2,第一象限的点坐标为(x+a,a-y),第二象限的点为(a+y,a+x),第三象限的点为(a-x,y+a),第四象限的点为(a-y,a-x),其中0<x,y<=a
当n为偶数:半周长a=n/2,第一象限的点坐标为(x+a,a-y),第二象限的点为(a+y,a+x),第三象限的点为(a-x,y+a),第四象限的点为(a-y,a-x),其中0<x,y<=a
其中x是对中心原点的x轴偏移,y是对中心原点的y轴偏移,对于n为奇数,除了旋转每个象限的元素,还要旋转每个坐标轴的元素。
(注意横轴为x轴,纵轴为y轴,int matrix[i][j]中,i为纵轴值,j为横轴值)
public class Solution {
public void rotate(int[][] matrix) {
int n=matrix.length;
if(n==0)
return;
int a=n/2;
int flag=n%2;
int x,y,swap;
int i1,i2,i3,i4,j1,j2,j3,j4;
for(x=1;x<=a;x++)
for(y=1;y<=a;y++)
{
//odd
if(flag==0)
{
i1=a-y;j1=a+x-1;
i2=a+x-1;j2=a+y-1;
i3=a+y-1;j3=a-x;
i4=a-x;j4=a-y;
}
//even
else
{
i1=a-y;j1=a+x;
i2=a+x;j2=a+y;
i3=a+y;j3=a-x;
i4=a-x;j4=a-y;
}
swap=matrix[i4][j4];
matrix[i4][j4]=matrix[i3][j3];
matrix[i3][j3]=matrix[i2][j2];
matrix[i2][j2]=matrix[i1][j1];
matrix[i1][j1]=swap;
}
//point on axis
if(flag==1)
{
for(x=0;x<=a;x++)
{
swap=matrix[a+x][a];
matrix[a+x][a]=matrix[a][a+x];
matrix[a][a+x]=matrix[a-x][a];
matrix[a-x][a]=matrix[a][a-x];
matrix[a][a-x]=swap;
}
}
}
}