要点提示:
- 可以从最外层往最内层进行(跟剥洋葱一样),这样一层一层旋转,最终就可以实现所有的矩阵旋转
- 如何对一层进行旋转:我们定一个两个参考点:最外层的参考点为(0,0),(m-1,m-1).那么倒数第二外层的参考点就是(1,1),(m-2,m-2),然后能够组成90度的四个点就来回更换数值就可以了
- 类似的题目:旋转打印输出一个矩阵(类比推理,所有跟矩阵有关的进行固定方式的旋转,输出,都应该采取这样的方法)
废话少说,上代码
//顺时针旋转矩阵90度
void rotate(vector<vector<int>>&matrix, int l1, int c1, int l2, int c2){
int temp=0;
for(int i=0;i < l2-l1;i++){
temp = matrix[l1][i+c1];
matrix[l1][i+c1] = matrix[l2-i][c1];
matrix[l2-i][c1] = matrix[l2][c2-i];
matrix[l2][c2-i] = matrix[l1+i][c2];
matrix[l1+i][c2] = temp;
}
}
void rotateMatrix(vector<vector<int>>&matrix){
int sizeL = matrix.size();
int sizeC = matrix[0].size();
if(sizeL!=sizeC) return;
int l1=0;
int c1=0;
int l2=sizeC-1;
int c2=sizeC-1;
while(l1<l2){
rotate(matrix,l1++,c1++,l2--,c2--);
}
}
int main()
{
vector<vector<int>>v1 = {
{1,2,3,4,17},
{5,6,7,8,18},
{9,10,11,12,19},
{13,14,15,16,20},
{21,22,23,24,25}
};
cout<<"转换前:"<<endl;
for(int i=0;i<v1.size();i++){
for(int j=0;j<v1[i].size();j++){
cout<<v1[i][j]<<"\t";
}
cout<<endl;
}
rotateMatrix(v1);
cout<<"转换后:"<<endl;
for(int i=0;i<v1.size();i++){
for(int j=0;j<v1[i].size();j++){
cout<<v1[i][j]<<"\t";
}
cout<<endl;
}
return 0;
}
(如果有什么用例执行错误或者疑问,很期待大家在评论区提出。阿里嘎多!)