rubikscube

college code for finding optimal rubiks cube solutions in java

git clone https://9o.is/git/rubikscube.git

commit 0117d5af7a98c6bf14b9987fbe087f3c3ce3835e
parent fc6c5a6e96d2e7e091714c540bf1ffb542fc50e8
Author: Jul <jul@9o.is>
Date:   Sun, 21 Oct 2012 15:16:50 -0400

Correctly implemented setState method in RubiksCube class

Diffstat:
Msrc/RubiksColor.java | 10+++++-----
Msrc/RubiksCube.java | 215+++++++++++++++++++++++++++++++++++++++----------------------------------------
Msrc/RubiksTest.java | 6+++---
3 files changed, 113 insertions(+), 118 deletions(-)

diff --git a/src/RubiksColor.java b/src/RubiksColor.java @@ -20,11 +20,11 @@ public enum RubiksColor { } public static RubiksColor find(String string) { - if(string=="R") return RED; - else if(string=="G") return GREEN; - else if(string=="B") return BLUE; - else if(string=="Y") return YELLOW; - else if(string=="O") return ORANGE; + if(string.equals("R")) return RED; + else if(string.equals("G")) return GREEN; + else if(string.equals("B")) return BLUE; + else if(string.equals("Y")) return YELLOW; + else if(string.equals("O")) return ORANGE; else return WHITE; } } diff --git a/src/RubiksCube.java b/src/RubiksCube.java @@ -13,13 +13,13 @@ public class RubiksCube { private final int CUBE_SIZE = 3; /* 3-Dimensional array that stores the state of the cube. */ - private String cube[][][]; + private RubiksColor cube[][][]; /** * Initiates a rubik's cube at it's goal state. */ RubiksCube() { - cube = new String[CUBE_SIDES][CUBE_SIZE][CUBE_SIZE]; + cube = new RubiksColor[CUBE_SIDES][CUBE_SIZE][CUBE_SIZE]; initGoalState(); } @@ -28,7 +28,7 @@ public class RubiksCube { * false or it randomizes the state if parameter is true. */ RubiksCube(boolean random) { - cube = new String[CUBE_SIDES][CUBE_SIZE][CUBE_SIZE]; + cube = new RubiksColor[CUBE_SIDES][CUBE_SIZE][CUBE_SIZE]; if(random) { initGoalState(); initRandomState(); @@ -39,22 +39,20 @@ public class RubiksCube { * Initiates a Rubik's cube from an existing state. */ RubiksCube(RubiksState state) { - cube = new String[CUBE_SIDES][CUBE_SIZE][CUBE_SIZE]; - //initState(state); + cube = new RubiksColor[CUBE_SIDES][CUBE_SIZE][CUBE_SIZE]; + setState(state); } /** - * Sets the state to the given state. + * Sets the state of this rubik's cube to a new given state. */ public void setState(RubiksState state) { final int CORNERS = 4; //corners per side - String[] cornerColors = new String[CUBE_SIDES*CORNERS]; + RubiksColor[] cornerColors = new RubiksColor[CUBE_SIDES*CORNERS]; int i=0; for(char ch : state.getCorners().toCharArray()) { - System.out.println(state.getCorners().toCharArray().length); - //cornerColors[i] = RubiksColor.find(Character.toString(ch)); i++; - cornerColors[i] = Character.toString(ch); i++; + cornerColors[i] = RubiksColor.find(Character.toString(ch)); i++; } for(i=0; i<CUBE_SIDES; i++) for(int j=0; j<CORNERS; j++) { @@ -70,12 +68,11 @@ public class RubiksCube { } final int HALF_EDGES = 2; //half edges per side - String[] halfEdgesColors = new String[CUBE_SIDES*HALF_EDGES]; + RubiksColor[] halfEdgesColors = new RubiksColor[CUBE_SIDES*HALF_EDGES]; i=0; for(char ch : state.getHalfEdges().toCharArray()) { - //halfEdgesColors[i] = RubiksColor.find(Character.toString(ch)); i++; - halfEdgesColors[i] = Character.toString(ch); i++; + halfEdgesColors[i] = RubiksColor.find(Character.toString(ch)); i++; } for(i=0; i<CUBE_SIDES; i++) for(int j=0; j<HALF_EDGES; j++) { @@ -88,8 +85,7 @@ public class RubiksCube { i=0; for(char ch : state.getHalf2Edges().toCharArray()) { - //halfEdgesColors[i] = RubiksColor.find(Character.toString(ch)); i++; - halfEdgesColors[i] = Character.toString(ch); i++; + halfEdgesColors[i] = RubiksColor.find(Character.toString(ch)); i++; } for(i=0; i<CUBE_SIDES; i++) for(int j=0; j<HALF_EDGES; j++) { @@ -105,17 +101,16 @@ public class RubiksCube { * Resets the rubik's cube at it's goal state. */ public void initGoalState() { - int side,row,column, count=0; + int side,row,column; for (side=0; side<CUBE_SIDES; side++) for(row=0; row<CUBE_SIZE; row++) for (column=0; column<CUBE_SIZE; column++) { - cube[side][row][column] = ++count + " "; - /*if(side==0) cube[side][row][column]= RubiksColor.RED; + if(side==0) cube[side][row][column]= RubiksColor.RED; else if(side==1) cube[side][row][column]= RubiksColor.GREEN; else if(side==2) cube[side][row][column]= RubiksColor.YELLOW; else if(side==3) cube[side][row][column]= RubiksColor.BLUE; else if(side==4) cube[side][row][column]= RubiksColor.ORANGE; - else cube[side][row][column]= RubiksColor.WHITE; */ + else cube[side][row][column]= RubiksColor.WHITE; } } @@ -276,24 +271,24 @@ public class RubiksCube { */ private void rotatePieceVerticalClockwise(int piece) throws Exception { // change side 0 - String side0row0 = setColor(0, 0, piece, cube[5][0][piece]); - String side0row1 = setColor(0, 1, piece, cube[5][1][piece]); - String side0row2 = setColor(0, 2, piece, cube[5][2][piece]); + RubiksColor side0row0 = setColor(0, 0, piece, cube[5][0][piece]); + RubiksColor side0row1 = setColor(0, 1, piece, cube[5][1][piece]); + RubiksColor side0row2 = setColor(0, 2, piece, cube[5][2][piece]); // change side 2 - String side2row0 = setColor(2, 0, piece, side0row0); - String side2row1 = setColor(2, 1, piece, side0row1); - String side2row2 = setColor(2, 2, piece, side0row2); + RubiksColor side2row0 = setColor(2, 0, piece, side0row0); + RubiksColor side2row1 = setColor(2, 1, piece, side0row1); + RubiksColor side2row2 = setColor(2, 2, piece, side0row2); // change side 4 - String side4row0 = setColor(4, 0, piece, side2row0); - String side4row1 = setColor(4, 1, piece, side2row1); - String side4row2 = setColor(4, 2, piece, side2row2); + RubiksColor side4row0 = setColor(4, 0, piece, side2row0); + RubiksColor side4row1 = setColor(4, 1, piece, side2row1); + RubiksColor side4row2 = setColor(4, 2, piece, side2row2); // change side 5 - String side5row0 = setColor(5, 0, piece, side4row0); - String side5row1 = setColor(5, 1, piece, side4row1); - String side5row2 = setColor(5, 2, piece, side4row2); + RubiksColor side5row0 = setColor(5, 0, piece, side4row0); + RubiksColor side5row1 = setColor(5, 1, piece, side4row1); + RubiksColor side5row2 = setColor(5, 2, piece, side4row2); if(piece==0) rotateSideClockwise(1); else if(piece==2) rotateSideCounterClockwise(3); @@ -305,24 +300,24 @@ public class RubiksCube { */ private void rotatePieceVerticalCounterClockwise(int piece) throws Exception { // change side 0 - String side0row0 = setColor(0, 0, piece, cube[2][0][piece]); - String side0row1 = setColor(0, 1, piece, cube[2][1][piece]); - String side0row2 = setColor(0, 2, piece, cube[2][2][piece]); + RubiksColor side0row0 = setColor(0, 0, piece, cube[2][0][piece]); + RubiksColor side0row1 = setColor(0, 1, piece, cube[2][1][piece]); + RubiksColor side0row2 = setColor(0, 2, piece, cube[2][2][piece]); // change side 5 - String side5row0 = setColor(5, 0, piece, side0row0); - String side5row1 = setColor(5, 1, piece, side0row1); - String side5row2 = setColor(5, 2, piece, side0row2); + RubiksColor side5row0 = setColor(5, 0, piece, side0row0); + RubiksColor side5row1 = setColor(5, 1, piece, side0row1); + RubiksColor side5row2 = setColor(5, 2, piece, side0row2); // change side 4 - String side4row0 = setColor(4, 0, piece, side5row0); - String side4row1 = setColor(4, 1, piece, side5row1); - String side4row2 = setColor(4, 2, piece, side5row2); + RubiksColor side4row0 = setColor(4, 0, piece, side5row0); + RubiksColor side4row1 = setColor(4, 1, piece, side5row1); + RubiksColor side4row2 = setColor(4, 2, piece, side5row2); // change side 2 - String side2row0 = setColor(2, 0, piece, side4row0); - String side2row1 = setColor(2, 1, piece, side4row1); - String side2row2 = setColor(2, 2, piece, side4row2); + RubiksColor side2row0 = setColor(2, 0, piece, side4row0); + RubiksColor side2row1 = setColor(2, 1, piece, side4row1); + RubiksColor side2row2 = setColor(2, 2, piece, side4row2); if(piece==0) rotateSideCounterClockwise(1); else if(piece==2) rotateSideClockwise(3); @@ -353,26 +348,26 @@ public class RubiksCube { */ private void rotateSidePieceVerticalClockwise(int piece) throws Exception { // change side 0 - String side0col0 = setColor(0, piece, 0, cube[1][2][piece]); - String side0col1 = setColor(0, piece, 1, cube[1][1][piece]); - String side0col2 = setColor(0, piece, 2, cube[1][0][piece]); + RubiksColor side0col0 = setColor(0, piece, 0, cube[1][2][piece]); + RubiksColor side0col1 = setColor(0, piece, 1, cube[1][1][piece]); + RubiksColor side0col2 = setColor(0, piece, 2, cube[1][0][piece]); // change side 3 piece = switchPiece(piece); - String side3col0 = setColor(3, 0, piece, side0col0); - String side3col1 = setColor(3, 1, piece, side0col1); - String side3col2 = setColor(3, 2, piece, side0col2); + RubiksColor side3col0 = setColor(3, 0, piece, side0col0); + RubiksColor side3col1 = setColor(3, 1, piece, side0col1); + RubiksColor side3col2 = setColor(3, 2, piece, side0col2); // change side 4 - String side4col0 = setColor(4, piece, 2, side3col0); - String side4col1 = setColor(4, piece, 1, side3col1); - String side4col2 = setColor(4, piece, 0, side3col2); + RubiksColor side4col0 = setColor(4, piece, 2, side3col0); + RubiksColor side4col1 = setColor(4, piece, 1, side3col1); + RubiksColor side4col2 = setColor(4, piece, 0, side3col2); piece = switchPiece(piece); // change side 1 - String side1col0 = setColor(1, 2, piece, side4col0); - String side1col1 = setColor(1, 1, piece, side4col1); - String side1col2 = setColor(1, 0, piece, side4col2); + RubiksColor side1col0 = setColor(1, 2, piece, side4col0); + RubiksColor side1col1 = setColor(1, 1, piece, side4col1); + RubiksColor side1col2 = setColor(1, 0, piece, side4col2); if(piece==0) rotateSideCounterClockwise(5); else if(piece==2) rotateSideClockwise(2); @@ -384,25 +379,25 @@ public class RubiksCube { */ private void rotateSidePieceVerticalCounterClockwise(int piece) throws Exception { // change side 0 - String side0col0 = setColor(0, piece, 0, cube[3][0][switchPiece(piece)]); - String side0col1 = setColor(0, piece, 1, cube[3][1][switchPiece(piece)]); - String side0col2 = setColor(0, piece, 2, cube[3][2][switchPiece(piece)]); + RubiksColor side0col0 = setColor(0, piece, 0, cube[3][0][switchPiece(piece)]); + RubiksColor side0col1 = setColor(0, piece, 1, cube[3][1][switchPiece(piece)]); + RubiksColor side0col2 = setColor(0, piece, 2, cube[3][2][switchPiece(piece)]); // change side 1 - String side1col0 = setColor(1, 2, piece, side0col0); - String side1col1 = setColor(1, 1, piece, side0col1); - String side1col2 = setColor(1, 0, piece, side0col2); + RubiksColor side1col0 = setColor(1, 2, piece, side0col0); + RubiksColor side1col1 = setColor(1, 1, piece, side0col1); + RubiksColor side1col2 = setColor(1, 0, piece, side0col2); // change side 4 piece = switchPiece(piece); - String side4col0 = setColor(4, piece, 2, side1col0); - String side4col1 = setColor(4, piece, 1, side1col1); - String side4col2 = setColor(4, piece, 0, side1col2); + RubiksColor side4col0 = setColor(4, piece, 2, side1col0); + RubiksColor side4col1 = setColor(4, piece, 1, side1col1); + RubiksColor side4col2 = setColor(4, piece, 0, side1col2); // change side 3 - String side3col0 = setColor(3, 0, piece, side4col0); - String side3col1 = setColor(3, 1, piece, side4col1); - String side3col2 = setColor(3, 2, piece, side4col2); + RubiksColor side3col0 = setColor(3, 0, piece, side4col0); + RubiksColor side3col1 = setColor(3, 1, piece, side4col1); + RubiksColor side3col2 = setColor(3, 2, piece, side4col2); piece = switchPiece(piece); if(piece==0) rotateSideClockwise(5); @@ -434,26 +429,26 @@ public class RubiksCube { */ private void rotatePieceHorizontalClockwise(int piece) throws Exception { // change side 1 - String side1col0 = setColor(1, piece, 0, cube[2][piece][0]); - String side1col1 = setColor(1, piece, 1, cube[2][piece][1]); - String side1col2 = setColor(1, piece, 2, cube[2][piece][2]); + RubiksColor side1col0 = setColor(1, piece, 0, cube[2][piece][0]); + RubiksColor side1col1 = setColor(1, piece, 1, cube[2][piece][1]); + RubiksColor side1col2 = setColor(1, piece, 2, cube[2][piece][2]); // change side 5 piece = switchPiece(piece); - String side5col0 = setColor(5, piece, 2, side1col0); - String side5col1 = setColor(5, piece, 1, side1col1); - String side5col2 = setColor(5, piece, 0, side1col2); + RubiksColor side5col0 = setColor(5, piece, 2, side1col0); + RubiksColor side5col1 = setColor(5, piece, 1, side1col1); + RubiksColor side5col2 = setColor(5, piece, 0, side1col2); piece = switchPiece(piece); // change side 3 - String side3col0 = setColor(3, piece, 0, side5col0); - String side3col1 = setColor(3, piece, 1, side5col1); - String side3col2 = setColor(3, piece, 2, side5col2); + RubiksColor side3col0 = setColor(3, piece, 0, side5col0); + RubiksColor side3col1 = setColor(3, piece, 1, side5col1); + RubiksColor side3col2 = setColor(3, piece, 2, side5col2); // change side 2 - String side2col0 = setColor(2, piece, 0, side3col0); - String side2col1 = setColor(2, piece, 1, side3col1); - String side2col2 = setColor(2, piece, 2, side3col2); + RubiksColor side2col0 = setColor(2, piece, 0, side3col0); + RubiksColor side2col1 = setColor(2, piece, 1, side3col1); + RubiksColor side2col2 = setColor(2, piece, 2, side3col2); if(piece==0) rotateSideClockwise(0); else if(piece==2) rotateSideCounterClockwise(4); @@ -465,26 +460,26 @@ public class RubiksCube { */ private void rotatePieceHorizontalCounterClockwise(int piece) throws Exception { // change side 3 - String side3col0 = setColor(3, piece, 0, cube[2][piece][0]); - String side3col1 = setColor(3, piece, 1, cube[2][piece][1]); - String side3col2 = setColor(3, piece, 2, cube[2][piece][2]); + RubiksColor side3col0 = setColor(3, piece, 0, cube[2][piece][0]); + RubiksColor side3col1 = setColor(3, piece, 1, cube[2][piece][1]); + RubiksColor side3col2 = setColor(3, piece, 2, cube[2][piece][2]); // change side 5 piece = switchPiece(piece); - String side5col0 = setColor(5, piece, 2, side3col0); - String side5col1 = setColor(5, piece, 1, side3col1); - String side5col2 = setColor(5, piece, 0, side3col2); + RubiksColor side5col0 = setColor(5, piece, 2, side3col0); + RubiksColor side5col1 = setColor(5, piece, 1, side3col1); + RubiksColor side5col2 = setColor(5, piece, 0, side3col2); piece = switchPiece(piece); // change side 1 - String side1col0 = setColor(1, piece, 0, side5col0); - String side1col1 = setColor(1, piece, 1, side5col1); - String side1col2 = setColor(1, piece, 2, side5col2); + RubiksColor side1col0 = setColor(1, piece, 0, side5col0); + RubiksColor side1col1 = setColor(1, piece, 1, side5col1); + RubiksColor side1col2 = setColor(1, piece, 2, side5col2); // change side 2 - String side2col0 = setColor(2, piece, 0, side1col0); - String side2col1 = setColor(2, piece, 1, side1col1); - String side2col2 = setColor(2, piece, 2, side1col2); + RubiksColor side2col0 = setColor(2, piece, 0, side1col0); + RubiksColor side2col1 = setColor(2, piece, 1, side1col1); + RubiksColor side2col2 = setColor(2, piece, 2, side1col2); if(piece==0) rotateSideCounterClockwise(0); else if(piece==2) rotateSideClockwise(4); @@ -517,16 +512,16 @@ public class RubiksCube { checkValidSide(side); // side corners - String row0col0 = setColor(side, 0, 0, cube[side][2][0]); - String row0col2 = setColor(side, 0, 2, row0col0); - String row2col2 = setColor(side, 2, 2, row0col2); - String row2col0 = setColor(side, 2, 0, row2col2); + RubiksColor row0col0 = setColor(side, 0, 0, cube[side][2][0]); + RubiksColor row0col2 = setColor(side, 0, 2, row0col0); + RubiksColor row2col2 = setColor(side, 2, 2, row0col2); + RubiksColor row2col0 = setColor(side, 2, 0, row2col2); // side edges - String row0col1 = setColor(side, 0, 1, cube[side][1][0]); - String row1col2 = setColor(side, 1, 2, row0col1); - String row2col1 = setColor(side, 2, 1, row1col2); - String row1col0 = setColor(side, 1, 0, row2col1); + RubiksColor row0col1 = setColor(side, 0, 1, cube[side][1][0]); + RubiksColor row1col2 = setColor(side, 1, 2, row0col1); + RubiksColor row2col1 = setColor(side, 2, 1, row1col2); + RubiksColor row1col0 = setColor(side, 1, 0, row2col1); } /* @@ -537,16 +532,16 @@ public class RubiksCube { checkValidSide(side); // side corners - String row0col0 = setColor(side, 0, 0, cube[side][0][2]); - String row2col0 = setColor(side, 2, 0, row0col0); - String row2col2 = setColor(side, 2, 2, row2col0); - String row0col2 = setColor(side, 0, 2, row2col2); + RubiksColor row0col0 = setColor(side, 0, 0, cube[side][0][2]); + RubiksColor row2col0 = setColor(side, 2, 0, row0col0); + RubiksColor row2col2 = setColor(side, 2, 2, row2col0); + RubiksColor row0col2 = setColor(side, 0, 2, row2col2); // side edges - String row0col1 = setColor(side, 0, 1, cube[side][1][2]); - String row1col0 = setColor(side, 1, 0, row0col1); - String row2col1 = setColor(side, 2, 1, row1col0); - String row1col2 = setColor(side, 1, 2, row2col1); + RubiksColor row0col1 = setColor(side, 0, 1, cube[side][1][2]); + RubiksColor row1col0 = setColor(side, 1, 0, row0col1); + RubiksColor row2col1 = setColor(side, 2, 1, row1col0); + RubiksColor row1col2 = setColor(side, 1, 2, row2col1); } /* @@ -573,8 +568,8 @@ public class RubiksCube { * @param col The column of the cube. * @param color The new color for the side-row-col. */ - private String setColor(int side, int row, int col, String color) { - String oldValue = cube[side][row][col]; + private RubiksColor setColor(int side, int row, int col, RubiksColor color) { + RubiksColor oldValue = cube[side][row][col]; cube[side][row][col] = color; return oldValue; } @@ -585,7 +580,7 @@ public class RubiksCube { private void switchColors( int _side, int _row, int _col, int side, int row, int col) { - String oldValue = cube[_side][_row][_col]; + RubiksColor oldValue = cube[_side][_row][_col]; cube[_side][_row][_col] = cube[side][row][col]; cube[side][row][col] = oldValue; } diff --git a/src/RubiksTest.java b/src/RubiksTest.java @@ -23,8 +23,8 @@ class RubiksTest RubiksCube cube = new RubiksCube(); - // test if initState works - RubiksCube randomCube = new RubiksCube(true); + // test if setState works + /*RubiksCube randomCube = new RubiksCube(true); System.out.println("Goal State Cube:"); cube.printState(); System.out.println("Random State Cube:"); @@ -32,7 +32,7 @@ class RubiksTest randomCube.setState(cube.getState()); System.out.println("Random Cube in Goal State:"); - + randomCube.printState();*/