#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)
}