Поворот грани кубика рубика

#java #multidimensional-array #transpose

#java #многомерный массив #транспонировать

Вопрос:

У меня есть класс Face, который принимает массив целых чисел размером 3×3 для каждой отдельной грани кубика рубика. Я пытаюсь создать метод RotateRight (), посредством которого

 010203                 070401
040506     becomes     080502
070809                 090603
  

Однако я не уверен, как заставить мой метод RotateRight () возвращать тип Face (который является текущей ошибкой, с которой я сталкиваюсь при запуске своего кода). Могу ли я получить некоторую помощь с этим? Ниже приведен код, который у меня есть на данный момент:

 public class Face{
  private int[][] grid;

  public Face(int[][] grid){
    grid = new int[3][3];
  }


  public Face rotateRight(){
    int rows = 3;
    int cols = 3;
    int[][] transposedArray = new int[3][3];

    for (int i = 0; i<rows; i  ){
      for (int j = 0; j<cols; j  ){
        transposedArray[j][i]=grid[i][j];
      }
    }
  }
}
  

Комментарии:

1. Предполагается ли, что метод Rotate изменяет существующую грань или создает новую?

2. в чем заключаются ошибки. Можете ли вы также опубликовать ошибки?

3. Обратите внимание, что это, вероятно, было бы rotateFront методом на языке Cubing lingo.

4. @PM77-1 предполагается, что он вернет новую грань!

Ответ №1:

Для возврата необходимо создать новый Face экземпляр, но вам также необходимо адаптировать назначение массива в цикле. В противном случае вы не будете назначать правильные позиции.

 public Face rotateRight(){
    int rows = 3;
    int cols = 3;
    int[][] transposedArray = new int[3][3];

    for (int i = 0; i<rows; i  ){
        for (int j = 0; j<cols; j  ){
            transposedArray[j][2-i]=grid[i][j];
        }
    }
    return new Face(transposedArray);
}
  

Я взял на себя смелость немного адаптировать ваш код, чтобы разрешить вращение лицевой стороны для кубиков размером 3×3, 4×4, 5×5, …
причем в обоих направлениях

Вот класс со вспомогательными методами для демонстрации использования:

 public class Face{
    private int[][] grid;

    public Face(int[][] grid){
        this.grid = grid;
    }

    enum DIRECTION {
        RIGHT,
        LEFT
    }

    public Face rotateFront(DIRECTION direction){
        int rows = grid.length;
        int[][] transposedArray = new int[rows][rows];

        for (int i = 0; i<rows; i  ){
            for (int j = 0; j<rows; j  ){
                if (direction == DIRECTION.RIGHT) {
                    transposedArray[j][(rows-1)-i]=grid[i][j];
                } else {
                    transposedArray[(rows-1)-j][i]=grid[i][j];
                }
            }
        }

        return new Face(transposedArray);
    }

    public String toString() {
        int rows = grid.length;
        String output = "";
        for (int i = 0; i<rows; i  ){
            for (int j = 0; j<rows; j  ){
                output  = "["  grid[i][j] "] ";
            }
            output  = "n";
        }
        return output;
    }

    public static void main(String[] args) {
        int[][] originalArray = new int[][]{ { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }};

        System.out.println("Create our inital Face:");
        Face startFace = new Face(originalArray);
        System.out.println(startFace);

        System.out.println("Rotate our inital Face to the right:");
        Face rotatedFace = startFace.rotateFront(DIRECTION.RIGHT);
        System.out.println(rotatedFace);

        System.out.println("Rotate our rotated Face to the left:");
        Face rotatedFace2 = rotatedFace.rotateFront(DIRECTION.LEFT);
        System.out.println(rotatedFace2);
    }
}
  

Это выводит:

Создаем нашу первоначальную грань:
[1] [2] [3]
[4] [5] [6]
[7] [8] [9]

Поверните нашу начальную грань вправо:
[7] [4] [1]
[8] [5] [2]
[9] [6] [3]

Поверните нашу повернутую грань влево:
[1] [2] [3]
[4] [5] [6]
[7] [8] [9]

Я надеюсь, это поможет вам продолжить разработку кубика рубика.

Ответ №2:

Если я правильно понял ваш вопрос, вы потерпели неудачу, потому что вы не возвращаете тип грани в конце вашего метода. Если это правильно, вам просто нужно создать новый Face экземпляр в rotateRight() :

 public Face rotateRight(){
    int rows = 3;
    int cols = 3;
    int[][] transposedArray = new int[3][3];

    for (int i = 0; i<rows; i  ){
      for (int j = 0; j<cols; j  ){
        transposedArray[j][i]=grid[i][j];
      }
    }
    return new Face(transposedArray)
  }