我想要一个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)));
}
}
答案 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] |
[10, 40] |
[40, 10] |
[30, 60] |
另见:
• 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?