如何创建 5x5 二维数组的 2x2 子数组,旋转它,然后将它添加回原始数组?

How do I create a 2x2 subarray of a 5x5 2d array, rotate it, then add it back to the original array?

我正在尝试创建一个像“十五”这样的游戏,但不是将图块滑入一个空的 space,空的 space 被移除,您必须选择单独的 2x2 网格进行旋转为了得到正确顺序的所有数字。

我不知道如何从原始数组创建子数组并拥有它,以便将子数组的旋转应用于原始数组。

例如:

01 02 03 04 05  
06 07 09 14 10  
11 12 08 13 15  
16 17 18 19 20  
21 22 23 24 25  

为了解决游戏问题,您需要选择数字 9 并旋转 {09, 14} {08, 13} 顺时针.

我对编程还比较陌生,java所以非常感谢任何帮助!

假设您有一个二维数组(列数组),那么您的第一个索引是网格中的 x 坐标,第二个索引是网格中的 y 坐标。 x 和 y 参数表示用户点击的位置。但是如果你选择的位置在边界处,这个方法会抛出异常。

private static int[][] rotate2x2SubArray(int[][] grid, final int x, final int y) {
    final int topLeft = grid[x][y];
    final int topRight = grid[x + 1][y];
    final int bottomRight = grid[x + 1][y + 1];
    final int bottomLeft = grid[x][y + 1];

    //topRight's new value is topLeft's old value
    grid[x + 1][y] = topLeft;
    //bottomRight's new value is topRight's old value
    grid[x + 1][y + 1] = topRight;
    //bottomLeft's new value is bottomRight's old value
    grid[x][y + 1] = bottomRight;
    //topLeft's new value is bottomLeft's old value
    grid[x][y] = bottomLeft;

    return grid;
}

这只是我的方法。可能有一百种方法 faster/slower 或更灵活(旋转可变大小)。

这是一个概念证明。这是原始的 5 x 5 阵列。

  1  2  3  4  5
  6  7  8  9 10
 11 12 13 14 15
 16 17 18 19 20
 21 22 23 24 25

这是8逆时针旋转后的数组

  1  2  3  4  5
  6  7  9 14 10
 11 12  8 13 15
 16 17 18 19 20
 21 22 23 24 25

这是16顺时针旋转后的数组

  1  2  3  4  5
  6  7  9 14 10
 11 12  8 13 15
 21 16 18 19 20
 22 17 23 24 25

这是可运行的代码。我没有检查行或列是否小于最后一行或最后一列。我所做的只是创建旋转 2 x 2 子数组的方法。

public class RotateSubArray {

    public static void main(String[] args) {
        RotateSubArray rotate = new RotateSubArray();
        int[][] array = rotate.createArray();
        System.out.println(rotate.printArray(array));
        array = rotate.rotateSubArray(array, 1, 2, false);
        System.out.println(rotate.printArray(array));
        array = rotate.rotateSubArray(array, 3, 0, true);
        System.out.println(rotate.printArray(array));
    }
    
    public int[][] createArray() {
        int[][] output = new int[5][5];
        
        int count = 1;
        for (int i = 0; i < output.length; i++) {
            for (int j = 0; j < output[i].length; j++) {
                output[i][j] = count++;
            }
        }
        
        return output;
    }
    
    public String printArray(int[][] output) {
        StringBuilder builder = new StringBuilder();
        
        for (int i = 0; i < output.length; i++) {
            for (int j = 0; j < output[i].length; j++) {
                builder.append(String.format("%3d", output[i][j]));
            }
            builder.append(System.lineSeparator());
        }
        
        return builder.toString();
    }
    
    public int[][] rotateSubArray(int[][] array, int row, int column, 
            boolean clockwise) {
        int temp = array[row][column];
        int nextRow = row + 1;
        int nextColumn = column + 1;
        
        if (clockwise) {
            array[row][column] = array[nextRow][column];
            array[nextRow][column] = array[nextRow][nextColumn];
            array[nextRow][nextColumn] =  array[row][nextColumn];
            array[row][nextColumn] = temp;
        } else {
            array[row][column] = array[row][nextColumn];
            array[row][nextColumn] = array[nextRow][nextColumn];
            array[nextRow][nextColumn] = array[nextRow][column];
            array[nextRow][column] = temp;
        }
        
        return array;
    }

}