今天是c语言基础打卡的第34天,主要内容是矩阵的操作,希望大家能够理解呢,我就给大家记一下重点,给点课后题提示0.0。
相关链接:
【第34题】给定一个 n X n 的矩阵 和 R,求旋转 90R 度以后的矩阵
🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人
✨联系方式:2201891280(QQ)⏳全文大约阅读时间: 10min
🎁主要知识点
矩阵的旋转
矩阵的旋转过程:
[
1
2
3
4
5
6
7
8
9
]
[
7
4
1
8
5
2
9
6
3
]
\left[ \begin{array}{ccc} 1 & 2 & 3\\ \hdashline4 & 5 & 6\\ \hdashline7 & 8 & 9\\ \end{array} \right] \left[ \begin{array}{c:c:c} 7 & 4 & 1\\ 8 & 5 & 2\\ 9 & 6 & 3\\ \end{array} \right]
⎣⎡147258369⎦⎤⎣⎡789456123⎦⎤
可以很容易看出来变换过程是
m
a
t
[
i
]
[
j
]
−
>
m
a
t
[
j
]
[
n
−
1
−
i
]
mat[i][j] -> mat[j][n-1-i]
mat[i][j]−>mat[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. 旋转图像
给定一个
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;
}
📑写在最后
明天就考试了。明天就考试了!明天就考试了!!!妈耶。今天刚看完一遍,写了足足62页笔记,当年考研计网也就这样吧?这还是b4纸啊。慌张-.-