Hitscotty
4/6/2016 - 5:25 AM

Rubiks Cube

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;


	}
}

}