给定一个 n × n 的二维矩阵 matrix
表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例 1:
给定一个 n × n 的二维矩阵 matrix
表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[[7,4,1],[8,5,2],[9,6,3]]示例 2:
输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]] 输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[[7,4,1],[8,5,2],[9,6,3]]
这道题不是很困难,我觉得解决这道题在纸上多画一画,就能解决,这道题更多的其实是找规律 ,找到了规律,问题以及迎刃而解。
大概思路如下:大家理解思路可以先自己尝试写一写
//旋转图像
// 1 2 3 7 8 9
// 4 5 6 --》 8 5 2
// 7 8 9 9 6 3
//1.上下交换
//--> 1 2 3 7 8 9
// 4 5 6 ==》 4 5 6
//--> 7 8 9 1 2 3
//2.斜面交换
// 7 8 9 3 6 9
// 4 5 6 ==》 2 5 8
// 1 2 3 1 4 7
我注释写的也很清楚,废话不多说,直接上代码!
#include <stdio.h>
//旋转图像
// 1 2 3 7 8 9
// 4 5 6 --》 8 5 2
// 7 8 9 9 6 3
//1.上下交换
//--> 1 2 3 7 8 9
// 4 5 6 ==》 4 5 6
//--> 7 8 9 1 2 3
//2.斜面交换
// 7 8 9 3 6 9
// 4 5 6 ==》 2 5 8
// 1 2 3 1 4 7
int** revolve(int** nums,int i, int j)
{
int num = i*j/2, count = 0; //
int (*p)[i][j] = nums; //指针指向这个数组,用指针来操作
for(int a=0; a<i; a++)
{
for(int b=0; b<(j/2); b++) //--> 1 2 3
// 4 5 6
{ //--> 7 8 9
int temp; //将上下的数交换 规律:nunms[i][j] = nums[i][size-1-j]
temp = (*p)[a][b]; //--> 7 8 9
// 4 5 6
//--> 1 2 3
(*p)[a][b] = (*p)[a][j-1-b];
(*p)[a][j-1-b] = temp;
}
}
int b;
for(int a=0; a<i-1; a++)
{
for(b=0; b<j-1; b++) //斜面交换 : 规律:nums[i][j] = nums[size-1-j][size-1-i]
//斜面交换 ,只要交换
// 1 2 3
// 4 5
// 7
{ //上斜面
int temp = (*p)[a][b];
(*p)[a][b] = (*p)[i-1-b][j-1-a];
(*p)[i-1-b][j-1-a] = temp;
}
b--;
}
return nums;
}
int main()
{
int m = 4, n = 4;
int nums[4][4] = {{5,1,9,11}, {2,4,8,10}, {13,3,6,7}, {15,14,12,16}};
int (*p1)[4] = revolve(nums,4,4);
for(int i=0; i<4; i++)
{
for(int j=0; j<4; j++)
{
printf("%5d",*(p1[i]+j));
}
printf("\n");
}
}