复制多维数组的一部分
Copying parts of a multidimensional array
我正在尝试为立方体的每个面使用 6 个二维数组来创建 Rubiks 立方体。我可以使用此代码旋转整个立方体,但出于某种原因,当我尝试 "turn" 立方体的一个垂直条时,它无法正常工作。这是我目前所拥有的
import java.util.*;
public class RubiksCube {
public static void main(String[] args) {
String Empty[][] = {{"0","0","0"},{"0","0","0"},{"0","0","0"}};
String Front[][] = {{"F1","F1","F1"},{"F2","F2","F2"},{"F3","F3","F3"}};
String Back [][] = {{"B1","B1","B1"},{"B2","B2","B2"},{"B3","B3","B3"}};
String Top [][] = {{"T1","T1","T1"},{"T2","T2","T2"},{"T3","T3","T3"}};
String Under[][] = {{"U1","U1","U1"},{"U2","U2","U2"},{"U3","U3","U3"}};
String Left [][] = {{"L1","L1","L1"},{"L2","L2","L2"},{"L3","L3","L3"}};
String Right[][] = {{"R1","R1","R1"},{"R2","R2","R2"},{"R3","R3","R3"}};
Scanner Scan = new Scanner(System.in);
boolean repeat = true;
while (repeat) {
for (int x = 0; x < Front.length; x++) {
for (int y = 0; y < Front[0].length; y++) {
System.out.print(Under[x][y]);
}
System.out.println();
}
String command = Scan.nextLine();
Empty = Back;
if (command.equalsIgnoreCase("Up")) {
Back = Top;
Top = Front;
Front = Under;
Under = Empty;
}
if (command.equalsIgnoreCase("up1")) {
for (int x = 0; x < 3; x++) {
Back [x][0] = Top [x][0];
Top [x][0] = Front[x][0];
Front[x][0] = Under[x][0];
Under[x][0] = Empty[x][0];
}
}
}
}
}
因此,如果这个立方体向上翻转,则立方体的底部变为正面,背面变为底部,等等。当我使用 "Up1" 命令执行此操作时,立方体的底部似乎从我的数组中消失,顶部变成两个数组。我究竟做错了什么?我对使用多维数组还很陌生,我是不是犯了一些愚蠢的错误?
编辑: 所以出于某种原因为了简化事情,这可行
if (command.equalsIgnoreCase("up1")) {
String[] tmp = { Back[0][0], Back[1][0], Back[2][0] };
for (int x=0;x<3;x++) {
Back[x][0] = Top[x][0];
Top[x][0] = Front[x][0];
Front[x][0] = Under[x][0];
Under[x][0] = tmp[x];
}
}
但这并不
if (command.equalsIgnoreCase("up1")) {
String tmp [][] = Back;
for (int x=0;x<3;x++) {
Back[x][0] = Top[x][0];
Top[x][0] = Front[x][0];
Front[x][0] = Under[x][0];
Under[x][0] = tmp[x][0];
}
}
为什么第二个版本不能正常工作?
编辑2:
示例代码可以正常工作。它循环通过下、下、上、前,然后再下
U1 U1 U1
U2 U2 U2
U3 U3 U3
输入:up1
B1 U1 U1
B2 U2 U2
B3 U3 U3
输入:up1
T1 U1 U1
T2 U2 U2
T3 U3 U3
输入:up1
F1 U1 U1
F2 U2 U2
F3 U3 U3
输入:up1
U1 U1 U1
U2 U2 U2
U3 U3 U3
使用无法正常工作的二维临时数组的代码示例。由于某种原因,它跳过了立方体的底部
U1 U1 U1
U2 U2 U2
U3 U3 U3
输入:up1
T1 U1 U1
T2 U2 U2
T3 U3 U3
输入:up1
F1 U1 U1
F2 U2 U2
F3 U3 U3
输入up1
U1 U1 U1
U2 U2 U2
U3 U3 U3
输入:up1
T1 U1 U1
T2 U2 U2
T3 U3 U3
我认为更正确(但仍然不完整)的逻辑是:
String[] tmp = { Back[0][0], Back[1][0], Back[2][0] };
// this logic only takes into account the changes that occur
for (int i = 0; i < 3; i++) {
Back [i][0] = Under[i][0];
Under[i][0] = Front[i][0];
Front[i][0] = Top [i][0];
Top [i][0] = tmp [i];
}
您需要使用一个临时数组来存储您将要移动的第一个块的值,以便在开始覆盖它之前记录它的值,并在轮换结束时重新使用它来更新最后一个使用第一个块的先前值块。
此外,您的英文句子中方块移动的顺序与您的代码不符,因此我也更正了这一点。最后,我认为只移动每个块的第一个值是不够的。 我无法真正提出完整的解决方案,因为我不知道您决定以何种顺序对数组进行索引。例如, Back[0][0]
是在左上角还是在右上角?我可以看到两个决定的论据。
提示:稍微优化一下,避免每次都重新分配一个临时数组,你可以在开始时分配一个包含三个元素的数组,然后总是重复使用交换期间相同。
编辑:
你的第二个版本不起作用,因为你没有复制数组,你只是获取数组的 reference,这意味着如果数组被修改您的 tmp
变量也会受到影响,因为 tmp
和 Back
是指向完全相同数组的两个指针。
我正在尝试为立方体的每个面使用 6 个二维数组来创建 Rubiks 立方体。我可以使用此代码旋转整个立方体,但出于某种原因,当我尝试 "turn" 立方体的一个垂直条时,它无法正常工作。这是我目前所拥有的
import java.util.*;
public class RubiksCube {
public static void main(String[] args) {
String Empty[][] = {{"0","0","0"},{"0","0","0"},{"0","0","0"}};
String Front[][] = {{"F1","F1","F1"},{"F2","F2","F2"},{"F3","F3","F3"}};
String Back [][] = {{"B1","B1","B1"},{"B2","B2","B2"},{"B3","B3","B3"}};
String Top [][] = {{"T1","T1","T1"},{"T2","T2","T2"},{"T3","T3","T3"}};
String Under[][] = {{"U1","U1","U1"},{"U2","U2","U2"},{"U3","U3","U3"}};
String Left [][] = {{"L1","L1","L1"},{"L2","L2","L2"},{"L3","L3","L3"}};
String Right[][] = {{"R1","R1","R1"},{"R2","R2","R2"},{"R3","R3","R3"}};
Scanner Scan = new Scanner(System.in);
boolean repeat = true;
while (repeat) {
for (int x = 0; x < Front.length; x++) {
for (int y = 0; y < Front[0].length; y++) {
System.out.print(Under[x][y]);
}
System.out.println();
}
String command = Scan.nextLine();
Empty = Back;
if (command.equalsIgnoreCase("Up")) {
Back = Top;
Top = Front;
Front = Under;
Under = Empty;
}
if (command.equalsIgnoreCase("up1")) {
for (int x = 0; x < 3; x++) {
Back [x][0] = Top [x][0];
Top [x][0] = Front[x][0];
Front[x][0] = Under[x][0];
Under[x][0] = Empty[x][0];
}
}
}
}
}
因此,如果这个立方体向上翻转,则立方体的底部变为正面,背面变为底部,等等。当我使用 "Up1" 命令执行此操作时,立方体的底部似乎从我的数组中消失,顶部变成两个数组。我究竟做错了什么?我对使用多维数组还很陌生,我是不是犯了一些愚蠢的错误?
编辑: 所以出于某种原因为了简化事情,这可行
if (command.equalsIgnoreCase("up1")) {
String[] tmp = { Back[0][0], Back[1][0], Back[2][0] };
for (int x=0;x<3;x++) {
Back[x][0] = Top[x][0];
Top[x][0] = Front[x][0];
Front[x][0] = Under[x][0];
Under[x][0] = tmp[x];
}
}
但这并不
if (command.equalsIgnoreCase("up1")) {
String tmp [][] = Back;
for (int x=0;x<3;x++) {
Back[x][0] = Top[x][0];
Top[x][0] = Front[x][0];
Front[x][0] = Under[x][0];
Under[x][0] = tmp[x][0];
}
}
为什么第二个版本不能正常工作?
编辑2:
示例代码可以正常工作。它循环通过下、下、上、前,然后再下
U1 U1 U1
U2 U2 U2
U3 U3 U3
输入:up1
B1 U1 U1
B2 U2 U2
B3 U3 U3
输入:up1
T1 U1 U1
T2 U2 U2
T3 U3 U3
输入:up1
F1 U1 U1
F2 U2 U2
F3 U3 U3
输入:up1
U1 U1 U1
U2 U2 U2
U3 U3 U3
使用无法正常工作的二维临时数组的代码示例。由于某种原因,它跳过了立方体的底部
U1 U1 U1
U2 U2 U2
U3 U3 U3
输入:up1
T1 U1 U1
T2 U2 U2
T3 U3 U3
输入:up1
F1 U1 U1
F2 U2 U2
F3 U3 U3
输入up1
U1 U1 U1
U2 U2 U2
U3 U3 U3
输入:up1
T1 U1 U1
T2 U2 U2
T3 U3 U3
我认为更正确(但仍然不完整)的逻辑是:
String[] tmp = { Back[0][0], Back[1][0], Back[2][0] };
// this logic only takes into account the changes that occur
for (int i = 0; i < 3; i++) {
Back [i][0] = Under[i][0];
Under[i][0] = Front[i][0];
Front[i][0] = Top [i][0];
Top [i][0] = tmp [i];
}
您需要使用一个临时数组来存储您将要移动的第一个块的值,以便在开始覆盖它之前记录它的值,并在轮换结束时重新使用它来更新最后一个使用第一个块的先前值块。
此外,您的英文句子中方块移动的顺序与您的代码不符,因此我也更正了这一点。最后,我认为只移动每个块的第一个值是不够的。 我无法真正提出完整的解决方案,因为我不知道您决定以何种顺序对数组进行索引。例如, Back[0][0]
是在左上角还是在右上角?我可以看到两个决定的论据。
提示:稍微优化一下,避免每次都重新分配一个临时数组,你可以在开始时分配一个包含三个元素的数组,然后总是重复使用交换期间相同。
编辑:
你的第二个版本不起作用,因为你没有复制数组,你只是获取数组的 reference,这意味着如果数组被修改您的 tmp
变量也会受到影响,因为 tmp
和 Back
是指向完全相同数组的两个指针。