[英]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.