C++程序 将矩阵向右旋转K次
旋转矩阵指的是将一个矩阵向右旋转90度的操作,例如:
1 2 3 7 4 1
4 5 6 ==> 8 5 2
7 8 9 9 6 3
如果要将矩阵向右旋转K次,即:
1 2 3 6 9 8
4 5 6 ==> 3 2 7
7 8 9 4 5 1
现在我们来编写一个C++程序实现这个功能。
思路分析
首先将原矩阵转置,然后将每一行翻转。对于翻转k次来说,从右边开始k个元素不动,其余元素向右移动k个位置即可。
代码实现
下面给出C++代码实现:
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
void rotate(vector<vector<int>>& matrix, int k) {
int n = matrix.size();
k %= n; // k可能大于n,取余得到真正的旋转次数
if(k == 0) return; // 如果旋转次数为0,则矩阵不变
// 沿对角线翻转
for(int i=0; i<n-1; i++){
for(int j=0; j<n-i-1; j++){
swap(matrix[i][j], matrix[n-j-1][n-i-1]);
}
}
// 水平翻转每一行
for(int i=0; i<n; i++){
int l=0, r=n-k-1;
while(l < r) swap(matrix[i][l++], matrix[i][r--]);
l = n-k, r = n-1;
while(l < r) swap(matrix[i][l++], matrix[i][r--]);
l=0, r=n-1;
while(l < r) swap(matrix[i][l++], matrix[i][r--]);
}
}
};
int main(){
vector<vector<int>> matrix = {{1,2,3},{4,5,6},{7,8,9}};
Solution s;
s.rotate(matrix, 2);
for(int i=0; i<matrix.size(); i++){
for(int j=0; j<matrix[0].size(); j++){
cout<<matrix[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
代码说明
首先我们定义了一个Solution类,其中包含了一个rotate函数,函数接受两个参数:matrix和k。
变量n表示矩阵的长度(行和列个数相等),k可能大于n,因此我们对k取余得到真正的旋转次数。
对于矩阵的旋转操作,我们首先使用两个for循环沿着矩阵的对角线进行翻转,然后再水平翻转每一行。
对于翻转k次来说,从右边开始k个元素不动,其余元素向右移动k个位置即可,这里我们使用了三个循环来实现。
最后我们在main函数中定义了一个3*3的矩阵,并且将k设为2,打印出旋转后的矩阵。
结论
本文介绍了如何使用C++实现将矩阵向右旋转K次的操作。具体方法是将矩阵转置,然后将每一行翻转,对于翻转k次来说,从右边开始k个元素不动,其余元素向右移动k个位置即可。