2016-10-11 74 views
-3

我有矩阵,并且想要逆时针旋转它。 例如:Java - 如何旋转矩阵小于90度

1 2 3 4 
5 6 7 8 
9 10 11 12 
13 14 15 16 

become: 
2 3 4 8 
1 7 11 12 
5 6 10 16 
9 13 14 15 

这里的旋转是我到目前为止已经完成的方法。结果(如下所示)是矩阵旋转了90度;我希望能够以这样的方式旋转,即外环上的物件只能移动一个位置。

int[][] rotateArray(int[][] m) { 
     int e = m.length - 1; 
     int c = e/2; 
     int b = e % 2; 
     for (int r = c; r >= 0; r--) { 
      for (int d = c - r; d < c + r + b; d++) { 
       int t = m[c - r][d]; 
       m[c - r][d] = m[d][e - c + r]; 
       m[d][e - c + r] = m[e - c + r][e - d]; 
       m[e - c + r][e - d] = m[e - d][c - r]; 
       m[e - d][c - r] = t; 
      } 
     } 

     return m; 
    } 

电流输出

4 8 12 16 
3 7 11 15 
2 6 10 14 
1 5 9 13 

请帮帮忙,谢谢:)

+0

的可能的复制[阵列顺时针旋转](http://stackoverflow.com/questions/2799755/rotate-array-clockwise) – DimaSan

+0

您的矩阵不是2x2,我看不出输出的明显错误。什么是实际问题? –

+0

对不起,我认为这是不同的,想要90度旋转,但我想更喜欢左移1 – sptra

回答

0

试试这个。

static final int[][][] ROT = { 
    {{1, 0}, {0, 0}, {0, 1}, {0, 2}}, 
    {{2, 0}, {2, 1}, {1, 1}, {0, 3}}, 
    {{3, 0}, {2, 2}, {1, 2}, {1, 3}}, 
    {{3, 1}, {3, 2}, {3, 3}, {2, 3}}, 
}; 

int[][] rotateArray(int[][] m) { 
    int[][] result = new int[m.length][m[0].length]; 
    for (int row = 0; row < m.length; ++row) 
     for (int col = 0; col < m[0].length; ++col) 
      result[ROT[row][col][0]][ROT[row][col][1]] = m[row][col]; 
    return result; 
} 

而且

int[][] m = { 
     { 1, 2, 3, 4}, 
     { 5, 6, 7, 8}, 
     { 9, 10, 11, 12}, 
     {13, 14, 15, 16}, 
    }; 
    int[][] rotated = rotateArray(m); 
    for (int[] row : rotated) 
     System.out.println(Arrays.toString(row)); 

结果:

[2, 3, 4, 8] 
[1, 7, 11, 12] 
[5, 6, 10, 16] 
[9, 13, 14, 15] 
+0

哇谢谢,但你能解释为什么你把静态变量“ROT”在那里?为什么ROT的价值是这样的?非常感谢你 – sptra

+0

'ROT'显示每个元素的目的地。例如,'m [0] [0]'必须转到'result [1] [0]','m [0] [1]'必须转到'result [0] [0]'等等。 – saka1029