全文目录
🎁主要知识点
矩阵的旋转
📓课后习题
48. 旋转图像
📑写在最后
今天是c语言基础打卡的第34天,主要内容是矩阵的操作,希望大家能够理解呢,我就给大家记一下重点,给点课后题提示0.0。
相关链接:
【第34题】给定一个 n X n 的矩阵 和 R,求旋转 90R 度以后的矩阵
🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人
✨联系方式:2201891280(QQ)
⏳全文大约阅读时间: 10min
🎁主要知识点
矩阵的旋转
矩阵的旋转过程:
可以很容易看出来变换过程是
m a t [ i ] [ j ] − > m a t [ j ] [ n − 1 − i ]
只要遍历矩阵的上半部分或者下半部分进行元素的交换就好了。
void clockwiseRotate90(int n, int mat[maxn][maxn]) { int tmp[maxn][maxn]; int i, j; for(i = 0; i < n; ++i) for(j = 0; j < n; ++j) tmp[j][n-1-i] = mat[i][j]; // 旋转后元素 for(i = 0; i < n; ++i) for(j = 0; j < n; ++j) mat[i][j] = tmp[i][j]; // 矩阵元素写回 }
📓课后习题
48. 旋转图像
48. 旋转图像
给定一个n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
解题思路
其实大哥的思路是对的,但是我们关注最后的表达式,可以得到旋转其实就是完成两件事
对矩阵进行转置
对矩阵左右进行一个径向 对称过去
有这样的思路我们可以原地旋转了。
void rotate(int** matrix, int matrixSize, int* matrixColSize){ //转置 for(int i = 0;i < matrixSize; ++i) for(int j = i + 1;j < *matrixColSize; ++j){ matrix[i][j] = matrix[i][j] ^ matrix[j][i]; matrix[j][i] = matrix[i][j] ^ matrix[j][i]; matrix[i][j] = matrix[i][j] ^ matrix[j][i]; } //水平翻转 for(int i = 0;i < matrixSize; ++i) for(int j = 0;j < *matrixColSize /2; ++j){ matrix[i][j] = matrix[i][j] ^ matrix[i][*matrixColSize - 1 -j]; matrix[i][*matrixColSize - 1 -j] = matrix[i][j] ^ matrix[i][*matrixColSize - 1 -j]; matrix[i][j] = matrix[i][j] ^ matrix[i][*matrixColSize - 1 -j]; } return matrix; }