如何创建 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;
}
}
我正在尝试创建一个像“十五”这样的游戏,但不是将图块滑入一个空的 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;
}
}