复制多维数组的部分

时间:2017-12-22 22:35:57

标签: java multidimensional-array rubiks-cube

我正在尝试为立方体的每个面使用6个2D数组创建一个Rubiks立方体。我可以使用这个代码旋转整个立方体,但出于某种原因,当我尝试“转动”立方体的一个垂直条带时,它无法正常工作。这是我到目前为止所拥有的

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];
        }
    }

为什么第二个版本无法正常工作?

EDIT2:

代码运行正常的示例。它循环通过底部,底部,顶部,前部,然后再次下面

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    

使用无法正常工作的2D临时数组的代码示例。它出于某种原因跳过了立方体的底部

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

1 个答案:

答案 0 :(得分:0)

我认为更正确(但仍然不完整)的逻辑是:

 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]吗?我可以看到两个决定的论点。

提示:优化一点,避免每次在开始时分配三个元素的单个数组时重新分配临时数组,然后在交换期间始终重复使用相同的数组。

编辑:

您的第二个版本无法正常工作,因为您没有复制数组,而您只是获取数组的引用,这意味着如果数组是修改后的tmp变量也会受到影响,因为tmpBack是完全相同数组的两个指针。