2012-11-20 162 views
2

我有下面的代码似乎旋转矩阵左90度......但我后来旋转它的权利不离开:D尝试改变它,但不断弄乱东西了... ...向右旋转2d阵列

public static int[,] RotateMatrix(int[,] matrix, int n) 
    { 
     int[,] ret = new int[n, n]; 

     for (int i = 0; i < n; ++i) 
     { 
      for (int j = 0; j < n; ++j) 
      { 
       ret[i, j] = matrix[n - j - 1, i]; 
      } 
     } 

     return ret; 
    } 

我该如何旋转它?

回答

4

嗯,其实所示的代码片段把它顺时针方向(即,向右)......但如果你想在另一个方向走,只是交换坐标:

ret[i, j] = matrix[j, n - i - 1]; 

它实际上相当容易,如果你想一下。让我们想象一下,你有这样的4x4矩阵:

===========================> 
| 0,0 | 0,1 | 0,2 | 0,3 | J 
| 1,0 | 1,1 | 1,2 | 1,3 | 
| 2,0 | 2,1 | 2,2 | 2,3 | 
| 3,0 | 3,1 | 3,2 | 3,3 | 
========================= 
| I 
V 

而现在,而不是单位矩阵旋转,绕其中心轴线:

<=========================== 
I | 0,0 | 0,1 | 0,2 | 0,3 | 
    | 1,0 | 1,1 | 1,2 | 1,3 | 
    | 2,0 | 2,1 | 2,2 | 2,3 | 
    | 3,0 | 3,1 | 3,2 | 3,3 | 
    ========================= 
         J | 
          V 

看看会发生什么?垂直的一个保持不变,它只是改变了它的名字(从I到J)。水平的不仅改变了它的名字,而且还转到了另一边:这正是n - j - 1公式所表达的。 )

而完全相同的思维技巧将帮助您理解逆时针旋转矩阵的公式。 )