Rubiks Cube
package Rubiks1D;
/**
* Class that manipulates the movements of cube as a 1D respresentation
*
* @author Scotty
*
*/
public class movement {
// ----------------------------------------------------------------------------
// General Moves (clockWise)
// ----------------------------------------------------------------------------
public static void up(Cube[] C) {
int[] rotate = { 9, 10, 11 };
Cube temper;
for (int i = 0; i < 3; i++) {
int spot = rotate[i];
temper = C[spot];
C[spot] = C[spot + 9];
C[spot + 9] = C[spot + 18];
C[spot + 18] = C[spot + 27];
C[spot + 27] = temper;
}
int [] leftR = {0, 1};
for(int place: leftR){
temper = C[place];
if(place == 0){
C[place] = C[place + 6];
C[place + 6] = C[place + 8];
C[place + 8] = C[place + 2];
C[place + 2] = temper;
}
if(place == 1){
C[place] = C[place + 2];
C[place + 2] = C[place + 6];
C[place + 6] = C[place + 4];
C[place + 4] = temper;
}
}
}
public static void bottom(Cube[] C) {
int[] rotate = { 42, 43, 44 };
Cube temper;
for (int i = 0; i < 3; i++) {
int spot = rotate[i];
temper = C[spot];
C[spot] = C[spot - 9];
C[spot - 9] = C[spot - 18];
C[spot - 18] = C[spot - 27];
C[spot - 27] = temper;
}
int [] leftR = {45, 46};
for(int place: leftR){
temper = C[place];
if(place == 45){
C[place] = C[place + 6];
C[place + 6] = C[place + 8];
C[place + 8] = C[place + 2];
C[place + 2] = temper;
}
if(place == 46){
C[place] = C[place + 2];
C[place + 2] = C[place + 6];
C[place + 6] = C[place + 4];
C[place + 4] = temper;
}
}
}
// ----------------------------------------------------------------------------
public static void right(Cube[] C) {
int[] rotate = { 2, 5, 8 };
Cube temper;
for (int i = 0; i < 3; i++) {
int spot = rotate[i];
temper = C[spot];
C[spot] = C[spot + 18];
C[spot + 18] = C[spot + 45];
C[spot + 45] = C[spot + 36];
C[spot + 36] = temper;
}
int [] leftR = {27, 28};
for(int place: leftR){
temper = C[place];
if(place == 27){
C[place] = C[place + 6];
C[place + 6] = C[place + 8];
C[place + 8] = C[place + 2];
C[place + 2] = temper;
}
if(place == 28){
C[place] = C[place + 2];
C[place + 2] = C[place + 6];
C[place + 6] = C[place + 4];
C[place + 4] = temper;
}
}
}
public static void left(Cube[] C) {
int[] rotate = { 51, 48, 45 };
Cube temper;
for (int i = 0; i < 3; i++) {
int spot = rotate[i];
temper = C[spot];
C[spot] = C[spot - 27];
C[spot - 27] = C[spot - 45];
C[spot - 45] = C[spot - 9];
C[spot - 9] = temper;
}
int [] leftR = {17, 16};
for(int place: leftR){
temper = C[place];
if(place == 17){
C[place] = C[place - 6];
C[place - 6] = C[place - 8];
C[place - 8] = C[place - 2];
C[place - 2] = temper;
}
if(place == 16){
C[place] = C[place - 2];
C[place - 2] = C[place - 6];
C[place - 6] = C[place - 4];
C[place - 4] = temper;
}
}
}
// ----------------------------------------------------------------------------
public static void face(Cube[] C) {
int[] rotate = { 6, 7, 8, 24, 25 };
Cube temper;
for (int spot : rotate) {
if(spot == 6){
temper = C[spot];
C[spot] = C[spot + 21];
C[spot + 21] = C[spot + 41];
C[spot + 41] = C[spot + 11];
C[spot + 11] = temper;
}
if(spot == 7){
temper = C[spot];
C[spot] = C[spot + 23];
C[spot + 23] = C[spot + 39];
C[spot + 39] = C[spot + 7];
C[spot + 7] = temper;
}
if(spot == 8){
temper = C[spot];
C[spot] = C[spot + 25];
C[spot + 25] = C[spot + 37];
C[spot + 37] = C[spot + 3];
C[spot + 3] = temper;
}
if (spot == 24) {
temper = C[spot];
C[spot] = C[spot + 2];
C[spot + 2] = C[spot - 4];
C[spot - 4] = C[spot - 6];
C[spot - 6] = temper;
}
if(spot == 25){
temper = C[spot];
C[spot] = C[spot - 2];
C[spot - 2] = C[spot - 6];
C[spot - 6] = C[spot - 4];
C[spot - 4] = temper;
}
}
}
public static void back(Cube[] C) {
int[] rotate = { 0, 1, 2, 42, 43 };
Cube temper;
for (int spot : rotate) {
if(spot == 0){
temper = C[spot];
C[spot] = C[spot + 15];
C[spot + 15] = C[spot + 53];
C[spot + 53] = C[spot + 29];
C[spot + 29] = temper;
}
if(spot == 1){
temper = C[spot];
C[spot] = C[spot + 11];
C[spot + 11] = C[spot + 51];
C[spot + 51] = C[spot + 31];
C[spot + 31] = temper;
}
if(spot == 2){
temper = C[spot];
C[spot] = C[spot + 7];
C[spot + 7] = C[spot + 49];
C[spot + 49] = C[spot + 33];
C[spot + 33] = temper;
}
if (spot == 42) {
temper = C[spot];
C[spot] = C[spot + 2];
C[spot + 2] = C[spot - 4];
C[spot - 4] = C[spot - 6];
C[spot - 6] = temper;
}
if(spot == 43){
temper = C[spot];
C[spot] = C[spot - 2];
C[spot - 2] = C[spot - 6];
C[spot - 6] = C[spot - 4];
C[spot - 4] = temper;
}
}
}
// ----------------------------------------------------------------------------
// Counter ClockWise Moves
// ----------------------------------------------------------------------------
public static void upCounter(Cube[] C) {
int[] rotate = { 36, 37, 38 };
Cube temper;
for (int i = 0; i < 3; i++) {
int spot = rotate[i];
temper = C[spot];
C[spot] = C[spot - 9];
C[spot - 9] = C[spot - 18];
C[spot - 18] = C[spot - 27];
C[spot - 27] = temper;
}
}
public static void bottomCounter(Cube[] C) {
int[] rotate = { 15, 16, 17 };
Cube temper;
for (int i = 0; i < 3; i++) {
int spot = rotate[i];
temper = C[spot];
C[spot] = C[spot + 9];
C[spot + 9] = C[spot + 18];
C[spot + 18] = C[spot + 27];
C[spot + 27] = temper;
}
int [] leftR = {45, 46};
for(int place: leftR){
temper = C[place];
if(place == 45){
C[place] = C[place + 2];
C[place + 2] = C[place + 8];
C[place + 8] = C[place + 6];
C[place + 6] = temper;
}
if(place == 46){
C[place] = C[place + 4];
C[place + 4] = C[place + 6];
C[place + 6] = C[place + 2];
C[place + 2] = temper;
}
}
}
// ----------------------------------------------------------------------------
public static void rightCounter(Cube[] C) {
int[] rotate = { 53, 50, 47 };
Cube temper;
for (int i = 0; i < 3; i++) {
int spot = rotate[i];
temper = C[spot];
C[spot] = C[spot - 27];
C[spot - 27] = C[spot - 45];
C[spot - 45] = C[spot - 9];
C[spot - 9] = temper;
}
int [] leftR = {35, 34};
for(int place: leftR){
temper = C[place];
if(place == 35){
C[place] = C[place - 6];
C[place - 6] = C[place - 8];
C[place - 8] = C[place - 2];
C[place - 2] = temper;
}
if(place == 34){
C[place] = C[place - 2];
C[place - 2] = C[place - 6];
C[place - 6] = C[place - 4];
C[place - 4] = temper;
}
}
}
public static void leftCounter(Cube[] C){
int[] rotate = { 51, 48, 45 };
Cube temper;
for (int i = 0; i < 3; i++) {
int spot = rotate[i];
temper = C[spot];
C[spot] = C[spot - 9];
C[spot - 9] = C[spot - 45];
C[spot - 45] = C[spot - 27];
C[spot - 27] = temper;
}
int [] leftR = {17, 16};
for(int place: leftR){
temper = C[place];
if(place == 17){
C[place] = C[place - 2];
C[place - 2] = C[place - 8];
C[place - 8] = C[place - 6];
C[place - 6] = temper;
}
if(place == 16){
C[place] = C[place - 4];
C[place - 4] = C[place - 6];
C[place - 6] = C[place - 2];
C[place - 2] = temper;
}
}
}
// ----------------------------------------------------------------------------
public static void faceCounter(Cube[] C) {
int[] rotate = { 6, 7, 8, 24, 25 };
Cube temper;
for (int spot : rotate) {
if(spot == 6){
temper = C[spot];
C[spot] = C[spot + 21];
C[spot + 21] = C[spot + 41];
C[spot + 41] = C[spot + 11];
C[spot + 11] = temper;
}
if(spot == 7){
temper = C[spot];
C[spot] = C[spot + 23];
C[spot + 23] = C[spot + 39];
C[spot + 39] = C[spot + 7];
C[spot + 7] = temper;
}
if(spot == 8){
temper = C[spot];
C[spot] = C[spot + 25];
C[spot + 25] = C[spot + 37];
C[spot + 37] = C[spot + 3];
C[spot + 3] = temper;
}
if (spot == 24) {
temper = C[spot];
C[spot] = C[spot - 6];
C[spot - 6] = C[spot - 4];
C[spot - 4] = C[spot + 2];
C[spot + 2] = temper;
}
if(spot == 25){
temper = C[spot];
C[spot] = C[spot - 4];
C[spot - 4] = C[spot - 6];
C[spot - 6] = C[spot - 2];
C[spot - 2] = temper;
}
}
}
public static void backCounter(Cube [] C){
int[] rotate = { 0, 1, 2, 42, 43 };
Cube temper;
for (int spot : rotate) {
if(spot == 0){
temper = C[spot];
C[spot] = C[spot + 29];
C[spot + 29] = C[spot + 53];
C[spot + 53] = C[spot + 15];
C[spot + 15] = temper;
}
if(spot == 1){
temper = C[spot];
C[spot] = C[spot + 31];
C[spot + 31] = C[spot + 51];
C[spot + 51] = C[spot + 11];
C[spot + 11] = temper;
}
if(spot == 2){
temper = C[spot];
C[spot] = C[spot + 33];
C[spot + 33] = C[spot + 49];
C[spot + 49] = C[spot + 7];
C[spot + 7] = temper;
}
if (spot == 42) {
temper = C[spot];
C[spot] = C[spot - 6];
C[spot - 6] = C[spot - 4];
C[spot - 4] = C[spot + 2];
C[spot + 2] = temper;
}
if(spot == 43){
temper = C[spot];
C[spot] = C[spot - 4];
C[spot - 4] = C[spot - 6];
C[spot - 6] = C[spot - 2];
C[spot - 2] = temper;
}
}
}
// ----------------------------------------------------------------------------
// Middle Section Moves
// ----------------------------------------------------------------------------
public static void middleLeft(Cube[] C) {
int[] rotate = { 12, 13, 14 };
Cube temper;
for (int i = 0; i < 3; i++) {
int spot = rotate[i];
temper = C[spot];
C[spot] = C[spot + 9];
C[spot + 9] = C[spot + 18];
C[spot + 18] = C[spot + 27];
C[spot + 27] = temper;
}
}
public static void middleRight(Cube[] C) {
int[] rotate = { 39, 40, 41 };
Cube temper;
for (int i = 0; i < 3; i++) {
int spot = rotate[i];
temper = C[spot];
C[spot] = C[spot - 9];
C[spot - 9] = C[spot - 18];
C[spot - 18] = C[spot - 27];
C[spot - 27] = temper;
}
}
// ----------------------------------------------------------------------------
public static void middleUp(Cube[] C) {
int[] rotate = { 1, 4, 7 };
Cube temper;
for (int i = 0; i < 3; i++) {
int spot = rotate[i];
temper = C[spot];
C[spot] = C[spot + 18];
C[spot + 18] = C[spot + 45];
C[spot + 45] = temper;
}
}
public static void middleDown(Cube[] C) {
int[] rotate = { 52, 49, 46 };
Cube temper;
for (int i = 0; i < 3; i++) {
int spot = rotate[i];
temper = C[spot];
C[spot] = C[spot - 27];
C[spot - 27] = C[spot - 45];
C[spot - 45] = temper;
}
}
// Unique moves Combined
// ----------------------------------------------------------------------------
public static void whiteCross(Cube [] c){
face(c);
rightCounter(c);
bottomCounter(c);
right(c);
faceCounter(c);
faceCounter(c);
}
public static void permuteCross(Cube [] c){
faceCounter(c);
rightCounter(c);
bottomCounter(c);
right(c);
faceCounter(c);
faceCounter(c);
}
public static void superFlip(Cube [] c){
up(c);
right(c);
right(c);
face(c);
back(c);
right(c);
back(c);
back(c);
right(c);
up(c);
up(c);
left(c);
back(c);
back(c);
right(c);
upCounter(c);
bottom(c);
right(c);
right(c);
face(c);
rightCounter(c);
left(c);
back(c);
back(c);
up(c);
up(c);
face(c);
face(c);
}
public static void test(Cube [] c){
left(c);
right(c);
leftCounter(c);
rightCounter(c);
}
public static void reset(Cube [] c){
up(c);
bottom(c);
right(c);
upCounter(c);
}
}
package Rubiks1D;
import java.util.Random;
class Cube {
String color;
public Cube(){
}
}
public class User extends movement{
public enum move {
top, middle, bottom, left, center, right
}
// Create the Cube
//----------------------------------------------------------------------------
public static Cube[] createCube() {
Cube[] rubiks = new Cube[54];
for (int i = 0; i < 54; i++) {
rubiks[i] = new Cube();
if (i < 9 ) rubiks[i].color = "G";
if (i >= 9 && i < 18) rubiks[i].color = "R";
if (i >= 18 && i < 27) rubiks[i].color = "W";
if (i >= 27 && i < 36) rubiks[i].color = "O";
if (i >= 36 && i < 45) rubiks[i].color = "Y";
if (i >= 45 && i < 54) rubiks[i].color = "B";
}
return rubiks;
}
public static Cube[] createSudoku(){
Cube[] sudoku = new Cube[54];
String [] num = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
int count = 1;
for (int i = 0; i < 54; i++) {
sudoku[i] = new Cube();
if(count == 10) count = 1;
sudoku[i].color = "" + count;
count++;
}
return sudoku;
}
// Show the cube
//----------------------------------------------------------------------------
public static void display(Cube[] C) {
int[] row = { 9, 12, 15 };
// Top
System.out.printf("\t Top");
for (int i = 0; i < 9; i++) {
if (i % 3 == 0) System.out.printf("\n\t");
System.out.printf("%s ", C[i].color);
}
System.out.printf("\n");
// Middle Elongated
System.out.println("Left\tFront\tRight\tBack");
for (int i = 0; i < 3; i++) {
int place = row[i];
while (place < 45) {
System.out.printf("%s ", C[place].color);
System.out.printf("%s ", C[place + 1].color);
System.out.printf("%s ", C[place + 2].color);
System.out.printf("\t");
place += 9;
}
System.out.println("");
}
// bottom
System.out.printf("\tBottom");
for (int i = 45; i < 54; i++) {
if (i % 3 == 0) System.out.printf("\n\t");
System.out.printf("%s ", C[i].color);
}
}
public static boolean solve(Cube [] rubiks){
for (int i = 0; i < 54; i++) {
if (i < 9 && rubiks[i].color != "G") return false;
if (i >= 9 && i < 18 && rubiks[i].color != "R") return false;
if (i >= 18 && i < 27 && rubiks[i].color != "W") return false;
if (i >= 27 && i < 36 && rubiks[i].color != "O") return false;
if (i >= 36 && i < 45 && rubiks[i].color != "Y") return false;
if (i >= 45 && i < 54 && rubiks[i].color != "B") return false;
}
return true;
}
public static int isCross(Cube [] c){
int [] cross = {1, 3, 5, 7};
int count = 0;
for(int i = 0; i < cross.length; i++){
if(c[cross[i]].color != c[4].color) {
count++;
}
}
return count;
}
public static void scramble(Cube [] c){
Random scram = new Random();
int count = scram.nextInt(100);
while(count < 100){
int move = scram.nextInt(6);
switch(move){
case 0:
face(c);
break;
case 1:
right(c);
break;
case 2:
bottomCounter(c);
break;
case 3:
up(c);
break;
case 4:
left(c);
break;
case 5:
rightCounter(c);
break;
case 6:
left(c);
break;
default:
break;
}
count++;
}
}
//----------------------------------------------------------------------------
// Debug Section
//----------------------------------------------------------------------------
public static void main(String[] args) {
// TODO Auto-generated method stub
Cube[] Cube = createCube();
boolean unsolved = false;
int count = 1;
while(unsolved == false){
test(Cube);
System.out.println("\n");
System.out.println("\tTrial: " + count++);
display(Cube);
unsolved = solve(Cube);
}
//display(Cube);
}
}
package Rubiks1D;
public class Color{
/**
* Notes
* @param C
*/
public static void left(Cube[] C) {
int[] colored = {51, 48, 45, 24, 21, 18, 6, 3, 0};
Cube temper;
for (int i = 0; i < colored.length/4; i++) {
int count = i;
temper = C[count];
while(count < 7){
int spot = colored[count];
System.out.println(spot);
int next = spot + Math.abs(spot - (colored[count+3]));
System.out.println(next);
C[spot] = C[next];
count +=3;
}
C[colored.length] = temper;
}
}
public void face (Cube [] C){
int[] colored = {6, 7, 8, 27, 30, 33, 47, 46, 45, 17, 14, 11};
Cube temper;
for(int spot: colored){//rotate){
temper = C[spot];
int position = 0;
for(int i = 0; i < colored.length/4; i ++){
C[spot] = C[spot + (spot - (colored[i] + 4))];
position = spot - (colored[i] + 4);
}
C[spot + position] = temper;
}
}
}