简体   繁体   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?

I'm trying to create a game like "fifteen" but instead of sliding tiles into one empty space, the empty space is removed and you have to choose individual 2x2 grids to rotate in order to get all the numbers in the correct order.我正在尝试创建一个类似“十五”的游戏,但不是将瓷砖滑入一个空白空间,而是删除了空白空间,您必须选择单独的 2x2 网格进行旋转,以便以正确的顺序获得所有数字。

I'm stuck as to how to create a subarray from the original and have it so that the rotation of the subarray is applied to the original array.我一直不知道如何从原始数组创建子数组并拥有它,以便将子数组的旋转应用于原始数组。

For example:例如:

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  

in order to solve the game, you would need to choose the number 9 and and rotate {09, 14} {08, 13} clockwise.为了解决这个游戏,您需要选择数字 9 并顺时针旋转{09, 14} {08, 13}

I'm relatively new to programming and java so any help would be greatly appreciated!我对编程和 java 比较陌生,所以任何帮助将不胜感激!

Assuming you have a two dimensional array (an array of columns) then your first index is the x coordinate and the second index the y coordinate in your grid.假设您有一个二维数组(列数组),那么您的第一个索引是 x 坐标,第二个索引是网格中的 y 坐标。 The x and y parameter present the position where the user has clicked on. x 和 y 参数表示用户单击的 position。 However, this method will throw an exception if you choose a position at the border.但是,如果您在边界处选择 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;
}

This is just my approach.这只是我的方法。 There a probably a hundred ways which might be faster/slower or more flexible(rotate a variable size).可能有一百种方法可能更快/更慢或更灵活(旋转可变大小)。

Here's a proof of concept.这是一个概念证明。 This is the original 5 x 5 array.这是原始的 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

This is the array after the 8 has been rotated counter-clockwise.这是 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

This is the array after the 16 has been rotated clockwise.这是 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

Here's the runnable code.这是可运行的代码。 I didn't check for the row or column being less than the last row or column.我没有检查行或列是否小于最后一行或列。 All I did was create the method to rotate the 2 x 2 subarray.我所做的只是创建旋转 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