2010-04-25 248 views
4

,它编译罚款,但是当我尝试运行它说,数组索引越界异常。例如,我想{{10,20,30},{40,50,60}}旋转到{{40,10},{50,20},{60,30}}旋转2D矩阵我想要一个二维矩阵,以旋转的权利

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)));     

    } 

}

+0

为什么你有'j = j ++'之类的? '++'操作符已经修改了这个值; 'j ++'是你所需要的。 – Amber 2010-04-25 08:20:43

+0

您是否添加了跟踪语句来帮助追踪哪些值超出范围?就像上面的'rotateM [i] [j] = m [j] [m.length-i-1];'放在'System.out.println(“i =”+ i +“,j =” + j);' – MatrixFrog 2010-04-25 08:31:25

+0

感谢您的帮助!它应该是rotateM而不是m。 – adam 2010-04-25 08:41:24

回答

0

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

+0

我修复了它,但现在它说数组索引超出了界限例外。 – adam 2010-04-25 08:25:55

1

看起来你刚刚把你的索引颠倒了。

相反的:你应该写

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

所有的
rotateM[j][i] = m[m.length-i-1][j]; 
0

首先删除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]; 

这就是你所需要的。

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

回复:“但我不知道任何更多,如果这个代码旋转到左边或右边......” 它顺时针旋转,这点我敢肯定是“正确的” – adavea 2014-09-09 21:15:36

+0

是的,我虽然为两分钟,我认为它确实向右旋转。 – 2014-09-10 23:19:33