繁体   English   中英

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

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

我正在尝试创建一个类似“十五”的游戏,但不是将瓷砖滑入一个空白空间,而是删除了空白空间,您必须选择单独的 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 参数表示用户单击的 position。 但是,如果您在边界处选择 position,此方法会抛出异常。

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

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

这是一个概念证明。 这是原始的 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;
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM