题目链接:添加链接描述
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
思路:
思路还是比较简单的,但是写的时候有一些小细节没有注意到,主要思路如下:
将矩形框看作n/2个⚪构成的同心圆,旋转90°其实就是第i个圈,移动(n-2*i-1)次。然后将圈上的数字依次移动,在移动的时候,注意一些小细节,在何处转换方向,转换方向处的坐标,以及如何处理圈的开始以及结尾。
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n=matrix.size();
int k=n/2;
for(int i=0;i<k;i++){
int x=i,y=i;
int num=n-2*i-1;
num=max(0,num);
int f=0;
int tmp1=0;
while(num--){
int f=0;
int tmp1=0;
while(true){
if(x==i && y==i &&f==1){
//结尾处
matrix[x][y]=tmp1;
break;
}
int x2=0,y2=0;
if(x==i &&(y!=(n-i-1))){ //像右直走
x2=x;
y2=y+1;
}
else if(x==i &&y==(n-i-1)) //像右下拐弯
{
x2=x+1;
y2=y;
}
else if(y==n-i-1 && (x!=n-i-1)) //像下走
{
x2=x+1;
y2=y;
}
else if(y==n-i-1 && (x==n-i-1)) //在最后一行像左拐弯
{
x2=x;
y2=y-1;
}
else if(x==n-i-1 &&(y!=i)) //最后一行向左走
{
x2=x;
y2=y-1;
}
else if(x==n-i-1 && y==i) //向上走
{
x2=x-1;
y2=y;
}
else if(y==i && x!=i){
x2=x-1;
y2=y;
}
if(f==0){
//开头第一个
tmp1=matrix[x][y];
f=1;
}
int tmp2=matrix[x2][y2];
matrix[x2][y2]=tmp1;
x=x2;
y=y2;
if(x==i && y==i){
//如果是从圈尾到头
tmp1=tmp1;
}
else{
tmp1=tmp2;
}
}
}
}
}
};