leetcode: Rotate Image

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值