下面是一个3*3的矩阵,经过90度旋转,得到:
1 2 3 7 4 1
4 5 6 ——> 8 5 2
7 8 9 9 6 3
第 1 种方法:使用辅助数组
我们只看第1行的旋转:
1 2 3 。。1
。。。 ——> 。。2
。。。 。。3
可以看出第 1 行的元素旋转后,出现在倒数第 1 列的位置。并且第 1 行的第 x 个元素旋转后,出现在倒数第 1 列的第 x 个位置。
再来看第 2 行的元素,旋转后,出现在倒数第 2 列的位置上。
。。。 。4 。
4 5 6 ——> 。5 。
。。。 。6 。
由此我们可以得出:
对于矩阵中第 i 行的第 j 个元素,在旋转后,它出现在倒数第 i 列的第 j 个位置。
翻译成代码为:
matrix [ i ] [ j ] 旋转后为 matrix [ j ] [ n - i -1 ] (其中 n 为总列数)
#include<stdio.h>
void rotate(int** matrix, int matrixSize){
int i,j,m[matrixSize][matrixSize];
for(i=0;i<matrixSize;i++)
{
for(j=0;j<matrixSize;j++)
{
m[j][matrixSize-i-1]=matrix[i][j];
}
}
for(i=0;i<matrixSize;i++)
{
for(j=0;j<matrixSize;j++)
{
matrix[i][j]=m[i][j];
}
}
}
int main()
{
int* p[3];
int matrix[3][3]={{1,2,3},{4,5,6},{7,8,9}};
p[0]=&matrix[0][0];
p[1]=matrix[1];
p[2]=matrix[2];
rotate(p,3);
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
printf("%d ",matrix[i][j]);
}
printf("\n");
}
return 0;
}
第 2 种方法:翻转法
先将其对于水平轴翻转而言翻转得到:
1 2 3 7 8 9
4 5 6 ——> 4 5 6
7 8 9 1 2 3
再将其根据主对角线翻转得到:
7 8 9 7 4 1
4 5 6 ——> 8 5 2
1 2 3 9 6 3
从而得到答案。
对于水平轴翻转而言:
matrix [ i ] [ j ] ——> matrix [ n - i - 1 ] [ j ] (其中 n 为总行数)
对于主对角线翻转而言:
matrix [ i ] [ j ] ——> matrix [ j ] [ i ]
由两式合并得:
matrix [ i ] [ j ] ——> matrix [ j ] [ n - i - 1 ]
#include<stdio.h>
void swap(int* a, int* b) {
int t = *a;
*a = *b, *b = t;
}
void rotate(int** matrix, int matrixSize) {
// 水平翻转
for (int i = 0; i < matrixSize / 2; ++i) {
for (int j = 0; j < matrixSize; ++j) {
swap(&matrix[i][j], &matrix[matrixSize - i - 1][j]);
}
}
// 主对角线翻转
for (int i = 0; i < matrixSize; ++i) {
for (int j = 0; j < i; ++j) {
swap(&matrix[i][j], &matrix[j][i]);
}
}
}
int main()
{
int* p[3];
int matrix[3][3]={{1,2,3},{4,5,6},{7,8,9}};
p[0]=&matrix[0][0];
p[1]=matrix[1];
p[2]=matrix[2];
rotate(p,3);
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
printf("%d ",matrix[i][j]);
}
printf("\n");
}
return 0;
}