算法:顺时针旋转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;
}

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值