簡體   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