向右旋转2d矩阵

时间:2010-04-25 08:16:03

标签: java matrix rotation

我想要一个2d矩阵向右旋转,它编译得很好但是当我尝试运行时它表示数组索引超出范围异常。例如,我希望{{10,20,30},{40,50,60}}转为{{40,10},{50,20},{60,30}}

import java.util.*;
public class Rotate{
   public static int[][] rotate(int[][] m) {
     int [][] rotateM = new int[m[0].length][m.length];
     for (int i= 0; i< m.length; i++){
        for (int j= 0; j< m[0].length; j++){
           rotateM[i][j] = m[j][m.length-i-1];
        }
     }


     return rotateM;
  }
   public static void main(String[]args){
     int[][]m = {{10,20,30},
           {40,50,60}};
     System.out.println(Arrays.toString(rotate(m)));                  

  }

}

5 个答案:

答案 0 :(得分:2)

这是一个有效的例子:

private int[][] rotateMatrix(int[][] matrix)
{
    int backupH = h;
    int backupW = w;
    w = backupH;
    h = backupW;
    int[][] ret = new int[h][w];
    for (int i = 0; i < h; ++i) {
        for (int j = 0; j < w; ++j) {
            ret[i][j] = matrix[w - j - 1][i];
        }
    }

    return ret;
}

我用这段代码在俄罗斯方块中旋转我的砖块。 此代码顺时针旋转矩阵。

答案 1 :(得分:1)

看起来你刚刚推翻了索引。

而不是:

rotateM[i][j] = m[j][m.length-i-1];

你应该写:

rotateM[j][i] = m[m.length-i-1][j];

答案 2 :(得分:0)

不要使用i = i++增加。只需写下i++

答案 3 :(得分:0)

首先删除i = i ++。

i ++和j ++就足够了,初始化你的数组,你的逻辑就错了,

for (int j = 0; j < m[0].Length; j++)
    for (int i = 0; i < m.Length; i++)
         rotateM[j][i] = m[m.Length - i - 1][j];

这就是你所需要的。

答案 4 :(得分:0)

当您转置矩阵时,其每个单元格 [i][j] 变为 [j][i],但是当您将矩阵旋转 90 度时,其一侧的索引变为等于 {{1} }。指数从 0 开始。

the length of the side, minus 1, minus the current index of the side
int m = 2;
int n = 3;

int[][] arr1 = {{10, 20, 30}, {40, 50, 60}};
int[][] arr2 = new int[n][m];
int[][] arr3 = new int[n][m];
int[][] arr4 = new int[n][m];
<头>
原始矩阵 矩阵转置 将矩阵旋转 90º ⟳ 将矩阵旋转 90º ⟲
[10, 20, 30]
[40, 50, 60]
[10, 40]
[20, 50]
[30, 60]
[40, 10]
[50, 20]
[60, 30]
[30, 60]
[20, 50]
[10, 40]

另见:
How do I rotate a matrix 90 degrees counterclockwise in java?
Is there a way to reverse specific arrays in a multidimensional array in java?