CareerCup原题:
Given an image represented by an NxN matrix, where each pixel in the image is 4 bytes, write a method to rorate the image by 90 degrees. Can you do this in palce?
旋转可以一层一层来旋转。旋转矩阵某个值所在的位置会变,但是所在的层不变。如下图,A在最外层,B在次层。
AAAA
ABBA
ABBA
AAAA
按层循环来旋转每一层。
在旋转某一层时,保存上面的值,把左边的值放到到上面,下面的值放到到左边,右边的值放到到下面,再把保存的上面的值放到右边。依次循环,这样就不许额外空间。
void rotate(int matrix[][N],int n)//传递二维数组,指定第二维维数
{
for(int layer=0; layer<n/2; layer++)//分层次
{
int first=layer;
int last=n-1-layer;
for(int i=first; i<last; i++)//旋转第layer层
{
int offset=i-first;
//保存上面的值
int top=matrix[first][i];
//左边转到上面
matrix[first][i]=matrix[last-offset][first];
//下面转到左边
matrix[last-offset][first]=matrix[last][last-offset];
//右边转到下面
matrix[last][last-offset]=matrix[i][last];
//上面转到右边
matrix[i][last]=top;
}
}
}
测试代码:
#include<iostream>
using namespace std;
#define N 3
int matrix[3][3];
int main()
{
int k=1;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
matrix[i][j]=k++;
//旋转前
cout<<"旋转前"<<endl;
for(int i=0; i<N; i++)
{
for(int j=0; j<N; j++)
cout<<matrix[i][j];
cout<<endl;
}
rotate(matrix,N);
//旋转后
cout<<"旋转后"<<endl;
for(int i=0; i<N; i++)
{
for(int j=0; j<N; j++)
cout<<matrix[i][j];
cout<<endl;
}
return 0;
}