如何解决如何创建 5x5 2d 数组的 2x2 子数组,旋转它,然后将其添加回原始数组?
我正在尝试创建一个像“十五”这样的游戏,但不是将瓷砖滑入一个空白区域,而是删除了空白区域,您必须选择单独的 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;
}
这只是我的方法。可能有一百种可能更快/更慢或更灵活(旋转可变大小)的方法。
,这是一个概念证明。这是原始的 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,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;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。