如何将N×N矩阵旋转90度?

Pas*_*mer 25 c++ algorithm

如何将N×N矩阵旋转90度.我希望它在原地?

Pav*_*sky 51

for(int i=0; i<n/2; i++)
   for(int j=0; j<(n+1)/2; j++)
       cyclic_roll(m[i][j], m[n-1-j][i], m[n-1-i][n-1-j], m[j][n-1-i]);


void cyclic_roll(int &a, int &b, int &c, int &d)
{
   int temp = a;
   a = b;
   b = c;
   c = d;
   d = temp;
}
Run Code Online (Sandbox Code Playgroud)

注意我没有测试过这个,现在只是现场组成.请在进行任何操作前进行测试.

  • 解释索引..好吧,想想旋转90度时(i,j)的位置在哪里.想象一下picutre.(i,j) - >(end-j,i).原来距离左边很远,而且距离左边很远,因为它离矩阵的底部很远. (3认同)
  • 我无法编辑.代码应为(int i = 0; i <N/2; i ++)for(int j = 0; j <(N + 1)/ 2; j ++)cyclic_roll(a [i] [j],a [ N-1-j] [i],a [N-1-i] [N-1-j],a [j] [N-1-i]); (3认同)
  • 如果逆时针旋转,则映射为 a[p][k] --&gt; a[N-1-k][p] --&gt; a[N-1-p][N-1-k] - -&gt; a[k][N-1-p]。我认为 i 的约束也存在错误。在 for 循环中应该是 i &lt; n/2 (对于 j 没关系)。请看下面的 3x3 示例。数字 4 在旋转 2 时得到处理。您不想再次为 i = 1 和 j = 0 旋转。 (2认同)
  • cyclic_roll 函数的第三个参数仍然需要更正。它应该是 a[n-1-i][n-1-j] :) (2认同)

ell*_*c00 9

这是我的解决方案:(顺时针旋转pi/2)

  1. 进行数组的转置,(如矩阵转置)

  2. 反转每行的元素

    cons int row = 10;
    cons int col = 10;
    //transpose
    for(int r = 0; r < row; r++) {
      for(int c = r; c < col; c++) {  
        swap(Array[r][c], Array[c][r]);
      }
    }
    //reverse elements on row order
    for(int r = 0; r < row; r++) {
        for(int c =0; c < col/2; c++) {
          swap(Array[r][c], Array[r][col-c-1])
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

如果逆时针旋转pi/2

  1. 转置数组

  2. 按列顺序反转元素

永远不要测试代码!任何建议将不胜感激!

  • 同意@Jean-FrançoisCorbett 的观点不如其他答案有效。但是,这个肯定更简单。实际上,我也实现了相同的算法!! (2认同)