算法:顺时针旋转90度一个m*m矩阵

要点提示:

  1. 可以从最外层往最内层进行(跟剥洋葱一样),这样一层一层旋转,最终就可以实现所有的矩阵旋转
  2. 如何对一层进行旋转:我们定一个两个参考点:最外层的参考点为(0,0),(m-1,m-1).那么倒数第二外层的参考点就是(1,1),(m-2,m-2),然后能够组成90度的四个点就来回更换数值就可以了
  3. 类似的题目:旋转打印输出一个矩阵(类比推理,所有跟矩阵有关的进行固定方式的旋转,输出,都应该采取这样的方法)

废话少说,上代码

//顺时针旋转矩阵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;
}

(如果有什么用例执行错误或者疑问,很期待大家在评论区提出。阿里嘎多!)

发布了28 篇原创文章 · 获赞 15 · 访问量 8272

猜你喜欢

转载自blog.csdn.net/weixin_38976558/article/details/94614458