- import lejos.nxt.*;
- import lejos.nxt.comm.*;
- /**
- * Solve Rubik's Cube By CFOP
- * @author ChenWu http://www.diy-robots.com
- * @see CFOP
- */
- public class CFOP
- {
- static String SideColors[] = {
- "orgorwwoo",
- "oyggbobrg",
- "yyrgowwbw",
- "yrybgybbo",
- "gwwyybror",
- "bgrwwrbgy"
- };
- public static void main (String[] aArg) throws Exception
- {
- Steps.Clear();
- if(Rubik.ImportColor(SideColors)=="")
- {
- TopCross();
- TopCorner();
- SecondLayer();
- BottomCross();
- BottomCorner();
- ThirdLayerCorner();
- ThirdLayerCornerSnap();
- ThirdLayerBorderSnap();
- }
- //Now the steps are saved in Steps Object
- for(int i=0;i<Steps.Count;i++)
- {
- Steps.Index=i;
- //int c = Steps.Color(); //Color
- //bool ColockWise = Steps.ClockWise(); //Rotate direction
- //int Quarter = Steps.Quarter(); //Number of quarter be rotated
- }
- }
- public static void TopCross() throws Exception
- {
- int GetPos=0;
- int[] c=new int[5];
- int CurrentStep=Steps.Count;
- c[0]=Rubik.Sides[0][1][1];
- c[1]=Rubik.Sides[1][1][1];
- c[2]=Rubik.Sides[5][1][1];
- c[3]=Rubik.Sides[3][1][1];
- c[4]=Rubik.Sides[4][1][1];
- for(int i=1;i<5;i++)
- {
- CurrentStep=Steps.Count;
- Rubik.ChangeViewToColor(c[0]);
- Rubik.ChangeViewFromTopByNextColor(c[i]);
- GetPos=Rubik.FindBorderCell(c[0],c[i]);
- switch(GetPos)
- {
- case 101:
- //Already fixed
- break;
- case 110:
- Steps.AddStep(1, false, 1);
- Steps.AddStep(0, true, 1);
- Steps.AddStep(4, false, 1);
- Steps.AddStep(0, false, 1);
- break;
- case 140:
- Steps.AddStep(4, true, 1);
- Steps.AddStep(1, true, 1);
- break;
- case 104:
- Steps.AddStep(4, true, 1);
- Steps.AddStep(0, true, 1);
- Steps.AddStep(4, false, 1);
- Steps.AddStep(0, false, 1);
- break;
- case 130:
- Steps.AddStep(3, true, 1);
- Steps.AddStep(0, true, 1);
- Steps.AddStep(4, true, 1);
- Steps.AddStep(0, false, 1);
- break;
- case 103:
- Steps.AddStep(3, true, 1);
- Steps.AddStep(0, true, 2);
- Steps.AddStep(3, false, 1);
- Steps.AddStep(0, false, 2);
- break;
- case 150:
- Steps.AddStep(5, false, 1);
- Steps.AddStep(1, false, 1);
- break;
- case 105:
- Steps.AddStep(5, false, 1);
- Steps.AddStep(0, false, 1);
- Steps.AddStep(5, true, 1);
- Steps.AddStep(0, true, 1);
- break;
- case 241:
- Steps.AddStep(1, true, 1);
- break;
- case 214:
- Steps.AddStep(0, true, 1);
- Steps.AddStep(4, false, 1);
- Steps.AddStep(0, false, 1);
- break;
- case 243:
- Steps.AddStep(4, true, 2);
- Steps.AddStep(1, true, 1);
- Steps.AddStep(4, true, 2);
- break;
- case 234:
- Steps.AddStep(0, true, 1);
- Steps.AddStep(4, true, 1);
- Steps.AddStep(0, false, 1);
- break;
- case 253:
- Steps.AddStep(5, true, 2);
- Steps.AddStep(1, false, 1);
- Steps.AddStep(5, true, 2);
- break;
- case 235:
- Steps.AddStep(0, false, 1);
- Steps.AddStep(5, false, 1);
- Steps.AddStep(0, true, 1);
- break;
- case 251:
- Steps.AddStep(1, false, 1);
- break;
- case 215:
- Steps.AddStep(0, false, 1);
- Steps.AddStep(5, true, 1);
- Steps.AddStep(0, true, 1);
- break;
- case 312:
- Steps.AddStep(2,true,1);
- Steps.AddStep(5,true,1);
- Steps.AddStep(1,false,1);
- Steps.AddStep(5,false,1);
- break;
- case 321:
- Steps.AddStep(1,true,2);
- break;
- case 342:
- Steps.AddStep(4,false,1);
- Steps.AddStep(1,true,1);
- Steps.AddStep(4,true,1);
- break;
- case 324:
- Steps.AddStep(2,true,1);
- Steps.AddStep(1,true,2);
- break;
- case 352:
- Steps.AddStep(5,true,1);
- Steps.AddStep(1,false,1);
- Steps.AddStep(5,false,1);
- break;
- case 325:
- Steps.AddStep(2,false,1);
- Steps.AddStep(1,true,2);
- break;
- case 332:
- Steps.AddStep(2,true,1);
- Steps.AddStep(4,false,1);
- Steps.AddStep(1,true,1);
- Steps.AddStep(4,true,1);
- break;
- case 323:
- Steps.AddStep(2,true,2);
- Steps.AddStep(1,true,2);
- break;
- default:
- //Do nothing
- break;
- }
- for(Steps.Index=CurrentStep;Steps.Index<Steps.Count;Steps.Index++)
- {
- Rubik.RotateRealSide(Steps.Color(), Steps.ClockWise(), Steps.Quarter());
- }
- Rubik.ChangeViewToColor(c[0]);
- }
- }
- public static void TopCorner() throws Exception
- {
- int CurrentStep=Steps.Count;
- int GetPos=0;
- int[] c=new int[5];
- int nTopPos=0;
- int nOtherPos=0;
- int nSum=0;
- boolean bFlag=false;
- c[0]=Rubik.Sides[0][1][1];
- c[1]=Rubik.Sides[1][1][1];
- c[2]=Rubik.Sides[5][1][1];
- c[3]=Rubik.Sides[3][1][1];
- c[4]=Rubik.Sides[4][1][1];
- for(int i=1;i<5;i++)
- {
- Rubik.ChangeViewToColor(c[0]);
- Rubik.ChangeViewFromTopByNextColor(c[i]);
- int j=i+1;
- if(j==5) j=1;
- GetPos=Rubik.FindCornerCell(c[0],c[i],c[j]);
- if(GetPos!=1015)
- {
- //1015 means already fixed
- if(GetPos<2000)
- {
- //In top layer, move to bottom first
- CurrentStep=Steps.Count;
- nTopPos=GetBit(GetPos,3);
- nSum=GetSum(GetPos)-1;
- nOtherPos=(nTopPos==0?GetBit(GetPos,1):(nSum-nTopPos));
- if(nOtherPos==5 && nSum==6) bFlag=false;
- if(nOtherPos==5 && nSum==8) bFlag=true;
- if(nOtherPos==3 && nSum==8) bFlag=false;
- if(nOtherPos==3 && nSum==7) bFlag=true;
- if(nOtherPos==4 && nSum==7) bFlag=false;
- if(nOtherPos==4 && nSum==5) bFlag=true;
- if(nOtherPos==1 && nSum==5) bFlag=false;
- if(nOtherPos==1 && nSum==6) bFlag=true;
- Steps.AddStep(nOtherPos, bFlag, 1);
- Steps.AddStep(2, !bFlag, 1);
- Steps.AddStep(nOtherPos, !bFlag, 1);
- for(Steps.Index=CurrentStep;Steps.Index<Steps.Count;Steps.Index++)
- {
- Rubik.RotateRealSide(Steps.Color(), Steps.ClockWise(), Steps.Quarter());
- }
- Rubik.ChangeViewToColor(c[0]);
- Rubik.ChangeViewFromTopByNextColor(c[i]);
- GetPos=Rubik.FindCornerCell(c[0],c[i],c[j]);
- }
- //Now the block has move to bottom, or alreay at bottom
- CurrentStep=Steps.Count;
- nSum=GetSum(GetPos)-2-2; //1st"2":Bottom; 2nd"2":Layer
- if(nSum==8) Steps.AddStep(2, false, 1);
- if(nSum==7) Steps.AddStep(2, true, 2);
- if(nSum==5) Steps.AddStep(2, true, 1);
- for(Steps.Index=CurrentStep;Steps.Index<Steps.Count;Steps.Index++)
- {
- Rubik.RotateRealSide(Steps.Color(), Steps.ClockWise(), Steps.Quarter());
- }
- //Now the block is just under the bottom of current corner
- CurrentStep=Steps.Count;
- Rubik.ChangeViewToColor(c[0]);
- Rubik.ChangeViewFromTopByNextColor(c[i]);
- GetPos=Rubik.FindCornerCell(c[0],c[i],c[j]);
- nTopPos=GetBit(GetPos,3);
- nSum=GetSum(GetPos)-2-2;
- if(nSum!=6)
- {
- //Error
- return;
- }
- if(nTopPos==1)
- {
- Steps.AddStep(1, true, 1);
- Steps.AddStep(2, true, 1);
- Steps.AddStep(1, false, 1);
- }
- if(nTopPos==5)
- {
- Steps.AddStep(5, false, 1);
- Steps.AddStep(2, false, 1);
- Steps.AddStep(5, true, 1);
- }
- if(nTopPos==2)
- {
- Steps.AddStep(1, true, 1);
- Steps.AddStep(2, false,1);
- Steps.AddStep(1, false, 1);
- Steps.AddStep(5, false, 1);
- Steps.AddStep(2, true, 2);
- Steps.AddStep(5, true, 1);
- }
- for(Steps.Index=CurrentStep;Steps.Index<Steps.Count;Steps.Index++)
- {
- Rubik.RotateRealSide(Steps.Color(), Steps.ClockWise(), Steps.Quarter());
- }
- }
- }
- Rubik.ChangeViewToColor(c[0]);
- }
- public static void SecondLayer() throws Exception
- {
- int CurrentStep=Steps.Count;
- int GetPos=0, cu=0,cb=0; //CU:color on under side; CB: color on back side
- int Center1=0, Center2=0; //Center1, the rotate center; center2, theother center besides it
- int ErrC1=0,ErrC2=0; //ErrC1 and Errc2, the border need to be fixed
- int[] c=new int[6];
- boolean bFlag=true, bClockWise=false;
- c[0]=Rubik.Sides[0][1][1];
- c[1]=Rubik.Sides[1][1][1];
- c[2]=Rubik.Sides[5][1][1];
- c[3]=Rubik.Sides[3][1][1];
- c[4]=Rubik.Sides[4][1][1];
- c[5]=Rubik.Sides[2][1][1];
- //select from the buttom to move to second layer
- while(bFlag)
- {
- bFlag=false;
- ErrC1=0;
- for(int i=1;i<5;i++)
- {
- Rubik.ChangeViewToColor(c[0]);
- Rubik.ChangeViewFromTopByNextColor(c[i]);
- cu=Rubik.Sides[2][1][0];
- cb=Rubik.Sides[1][1][2];
- if(cu!=c[5] && cb!=c[5])
- {
- //This one can be moved to second layer
- CurrentStep=Steps.Count;
- bFlag=true;
- Center1=Rubik.FindCenter(cu);
- Center2=Rubik.FindCenter(cb);
- //Move to the opposite
- if(Center1==1) Steps.AddStep(2, true, 2);
- if(Center1==5) Steps.AddStep(2, false, 1);
- if(Center1==4) Steps.AddStep(2, true, 1);
- //Set the direction of rotate
- if(Center1==1 && Center2==5) bClockWise=true;
- if(Center1==1 && Center2==4) bClockWise=false;
- if(Center1==5 && Center2==3) bClockWise=true;
- if(Center1==5 && Center2==1) bClockWise=false;
- if(Center1==3 && Center2==4) bClockWise=true;
- if(Center1==3 && Center2==5) bClockWise=false;
- if(Center1==4 && Center2==1) bClockWise=true;
- if(Center1==4 && Center2==3) bClockWise=false;
- //Start rotate
- Steps.AddStep(Center1, bClockWise, 1);
- Steps.AddStep(2, !bClockWise, 1);
- Steps.AddStep(Center1, !bClockWise, 1);
- Steps.AddStep(2, !bClockWise, 1);
- Steps.AddStep(Center2, !bClockWise, 1);
- Steps.AddStep(2, bClockWise, 1);
- Steps.AddStep(Center2, bClockWise, 1);
- //Actions
- for(Steps.Index=CurrentStep;Steps.Index<Steps.Count;Steps.Index++)
- {
- Rubik.RotateRealSide(Steps.Color(), Steps.ClockWise(), Steps.Quarter());
- }
- Rubik.ChangeViewToColor(c[0]);
- break;
- }
- //Check if the sencond layer is ok
- if(!bFlag && ErrC1==0)
- {
- if(Rubik.Sides[1][1][1]!=Rubik.Sides[1][0][1] || Rubik.Sides[5][1][1]!=Rubik.Sides[5][1][2])
- {
- ErrC1=Rubik.Sides[1][1][1];
- ErrC2=Rubik.Sides[5][1][1];
- }
- }
- }
- }
- //Now All the blocks in bottom has been moved to second layer
- if(ErrC1>0)
- {
- //if there are still error blocks in second layer, move to bottom first
- Rubik.RotateRealSide(ErrC1, true, 1);
- Rubik.RotateRealSide(c[5], false, 1);
- Rubik.RotateRealSide(ErrC1, false, 1);
- Rubik.RotateRealSide(c[5], false, 1);
- Rubik.RotateRealSide(ErrC2, false, 1);
- Rubik.RotateRealSide(c[5], true, 1);
- Rubik.RotateRealSide(ErrC2, true, 1);
- Rubik.ChangeViewToColor(c[0]);
- SecondLayer();
- }
- }
- public static void BottomCross() throws Exception
- {
- int CurrentStep=Steps.Count;
- //Change view to the bottom
- int c=Rubik.Sides[2][1][1];
- int b[]=new int[4];
- int d[]={5,3,4,1};
- Rubik.ChangeViewToColor(c);
- int nSum=0, nPos=0;
- b[0]=Rubik.Sides[0][0][1];
- b[1]=Rubik.Sides[0][1][0];
- b[2]=Rubik.Sides[0][2][1];
- b[3]=Rubik.Sides[0][1][2];
- for(int i=0;i<4;i++)
- {
- if(b[i]==c)
- {
- nSum++;
- nPos+=d[i];
- }
- }
- if(nSum==4) return;
- if(nSum==0)
- {
- CurrentStep=Steps.Count;
- Steps.AddStep(1, false, 1);
- Steps.AddStep(4, false, 1);
- Steps.AddStep(0, false, 1);
- Steps.AddStep(4, true, 1);
- Steps.AddStep(0, true, 1);
- Steps.AddStep(1, true, 1);
- Steps.AddStep(3, false, 1);
- Steps.AddStep(0, false, 1);
- Steps.AddStep(5, false, 1);
- Steps.AddStep(0, true, 1);
- Steps.AddStep(5, true, 1);
- Steps.AddStep(3, true, 1);
- }
- if(nSum==2)
- {
- CurrentStep=Steps.Count;
- if(nPos==4) Rubik.ChangeViewFromTop(true);
- if(nPos==4 || nPos==9)
- {
- Steps.AddStep(1, false, 1);
- Steps.AddStep(4, false, 1);
- Steps.AddStep(0, false, 1);
- Steps.AddStep(4, true, 1);
- Steps.AddStep(0, true, 1);
- Steps.AddStep(1, true, 1);
- }
- else
- {
- if(nPos==6) Rubik.ChangeViewFromTop(false);
- if(nPos==7) Rubik.ChangeViewFromTop(true);
- if(nPos==5)
- {
- Rubik.ChangeViewFromTop(true);
- Rubik.ChangeViewFromTop(true);
- }
- Steps.AddStep(1, false, 1);
- Steps.AddStep(0, false, 1);
- Steps.AddStep(4, false, 1);
- Steps.AddStep(0, true, 1);
- Steps.AddStep(4, true, 1);
- Steps.AddStep(1, true, 1);
- }
- }
- for(Steps.Index=CurrentStep;Steps.Index<Steps.Count;Steps.Index++)
- {
- Rubik.RotateRealSide(Steps.Color(), Steps.ClockWise(), Steps.Quarter());
- }
- Rubik.ChangeViewToColor(c);
- }
- public static void BottomCorner() throws Exception
- {
- int CurrentStep=Steps.Count;
- int c=Rubik.Sides[0][1][1];
- int b[]=new int[4];
- int d[]={5,3,4,1};
- int Pos2[]={-1,-1};
- int nSum=0, nPos=0, nFirst=0, nSecond=0;
- boolean bDirect=true, bMoreTime=false;
- b[0]=Rubik.Sides[0][0][2];
- b[1]=Rubik.Sides[0][0][0];
- b[2]=Rubik.Sides[0][2][0];
- b[3]=Rubik.Sides[0][2][2];
- for(int i=0;i<4;i++)
- {
- if(b[i]==c)
- {
- nSum++;
- nPos=d[i];
- }
- else
- {
- if(Pos2[0]==-1) Pos2[0]=i;
- else Pos2[1]=i;
- }
- }
- if(nSum==4) return;
- if(nSum==1)
- {
- Rubik.ChangeViewFromTopByNextColor(Rubik.Sides[nPos][1][1]);
- bDirect=(Rubik.Sides[1][0][0]==c);
- if(bDirect) nFirst=5;
- else nFirst=3;
- Steps.Clear();
- Steps.AddStep(nFirst, bDirect, 1);
- Steps.AddStep(0, bDirect, 1);
- Steps.AddStep(nFirst, !bDirect, 1);
- Steps.AddStep(0, bDirect, 1);
- Steps.AddStep(nFirst, bDirect, 1);
- Steps.AddStep(0, bDirect, 2);
- Steps.AddStep(nFirst, !bDirect, 1);
- }
- if(nSum==2)
- {
- for(int i=0;i<Pos2[0];i++) Rubik.ChangeViewFromTop(true);
- bDirect=(Rubik.Sides[1][0][0]==c);
- nFirst=bDirect?5:1;
- nSecond=6-nFirst;
- Steps.Clear();
- Steps.AddStep(nFirst, bDirect, 1);
- Steps.AddStep(nSecond, !bDirect, 1);
- Steps.AddStep(nFirst, !bDirect, 1);
- Steps.AddStep(nSecond, bDirect, 1);
- Steps.AddStep(nFirst, bDirect, 1);
- Steps.AddStep(nSecond, !bDirect, 1);
- Steps.AddStep(nFirst, !bDirect, 1);
- Steps.AddStep(nSecond, bDirect, 1);
- Steps.AddStep(0, true, Pos2[1]-Pos2[0]);
- Steps.AddStep(nSecond, !bDirect, 1);
- Steps.AddStep(nFirst, bDirect, 1);
- Steps.AddStep(nSecond, bDirect, 1);
- Steps.AddStep(nFirst, !bDirect, 1);
- Steps.AddStep(nSecond, !bDirect, 1);
- Steps.AddStep(nFirst, bDirect, 1);
- Steps.AddStep(nSecond, bDirect, 1);
- Steps.AddStep(nFirst, !bDirect, 1);
- }
- if(nSum==0)
- {
- bMoreTime=true;
- for(int i=0;i<4;i++)
- {
- if(Rubik.Sides[1][0][0]==c && Rubik.Sides[1][2][0]==c) break;
- Rubik.ChangeViewFromTop(true);
- }
- nFirst=3;
- bDirect=false;
- Steps.Clear();
- Steps.AddStep(nFirst, bDirect, 1);
- Steps.AddStep(0, bDirect, 1);
- Steps.AddStep(nFirst, !bDirect, 1);
- Steps.AddStep(0, bDirect, 1);
- Steps.AddStep(nFirst, bDirect, 1);
- Steps.AddStep(0, bDirect, 2);
- Steps.AddStep(nFirst, !bDirect, 1);
- }
- for(Steps.Index=CurrentStep;Steps.Index<Steps.Count;Steps.Index++)
- {
- Rubik.RotateRealSide(Steps.Color(), Steps.ClockWise(), Steps.Quarter());
- }
- Rubik.ChangeViewToColor(c);
- if(bMoreTime) BottomCorner();
- }
- public static void ThirdLayerCorner() throws Exception
- {
- int CurrentStep=Steps.Count;
- int c=Rubik.Sides[0][1][1];
- boolean bMoreTime=true;
- for(int i=0;i<4;i++)
- {
- if(Rubik.Sides[1][0][0] == Rubik.Sides[1][2][0])
- {
- if(Rubik.Sides[5][2][0] == Rubik.Sides[5][2][2]) return;
- else
- {
- bMoreTime=false;
- break;
- }
- }
- Rubik.ChangeViewFromTop(true);
- }
- Steps.AddStep(5, true, 1);
- Steps.AddStep(3, false, 1);
- Steps.AddStep(5, true, 1);
- Steps.AddStep(1, true, 2);
- Steps.AddStep(5, false, 1);
- Steps.AddStep(3, true, 1);
- Steps.AddStep(5, true, 1);
- Steps.AddStep(1, true, 2);
- Steps.AddStep(5, true, 2);
- for(Steps.Index=CurrentStep;Steps.Index<Steps.Count;Steps.Index++)
- {
- Rubik.RotateRealSide(Steps.Color(), Steps.ClockWise(), Steps.Quarter());
- }
- Rubik.ChangeViewToColor(c);
- if(bMoreTime) ThirdLayerCorner();
- }
- public static void ThirdLayerCornerSnap() throws Exception
- {
- int c=Rubik.Sides[0][1][1];
- int nBorderColor=Rubik.Sides[1][0][0];
- int nCenter=Rubik.FindCenter(nBorderColor);
- int CurrentStep=Steps.Count;
- if(nCenter==5) Steps.AddStep(0, false, 1);
- if(nCenter==3) Steps.AddStep(0, false, 2);
- if(nCenter==4) Steps.AddStep(0, true, 1);
- for(Steps.Index=CurrentStep;Steps.Index<Steps.Count;Steps.Index++)
- {
- Rubik.RotateRealSide(Steps.Color(), Steps.ClockWise(), Steps.Quarter());
- }
- Rubik.ChangeViewToColor(c);
- }
- public static void ThirdLayerBorderSnap() throws Exception
- {
- int c=Rubik.Sides[0][1][1];
- boolean bMoreTime=true;
- boolean bDirect=true;
- for(int i=0;i<4;i++)
- {
- if(Rubik.Sides[1][0][0] == Rubik.Sides[1][1][0])
- {
- if(Rubik.Sides[5][2][0] == Rubik.Sides[5][2][1]) return;
- else
- {
- bDirect=(Rubik.Sides[5][2][1]==Rubik.Sides[4][1][1]);
- bMoreTime=false;
- break;
- }
- }
- Rubik.ChangeViewFromTop(true);
- }
- int CurrentStep=Steps.Count;
- Steps.AddStep(3, true, 2);
- Steps.AddStep(0, bDirect, 1);
- Steps.AddStep(4, false, 1);
- Steps.AddStep(5, true, 1);
- Steps.AddStep(3, true, 2);
- Steps.AddStep(5, false, 1);
- Steps.AddStep(4, true, 1);
- Steps.AddStep(0, bDirect, 1);
- Steps.AddStep(3, true, 2);
- for(Steps.Index=CurrentStep;Steps.Index<Steps.Count;Steps.Index++)
- {
- Rubik.RotateRealSide(Steps.Color(), Steps.ClockWise(), Steps.Quarter());
- }
- Rubik.ChangeViewToColor(c);
- if(bMoreTime) ThirdLayerBorderSnap();
- }
- public static int GetBit(int n, int m)
- {
- double nFilter=Math.pow(10.,m-1);
- n=(int) Math.floor(n/nFilter);
- return n%10;
- }
- public static int GetSum(int n)
- {
- int nReturn=0;
- while(n>0)
- {
- nReturn+=n%10;
- n=(n-n%10)/10;
- }
- return nReturn;
- }
- public static class Rubik
- {
- static int[][][] Sides=new int [7][3][3];
- static int[] Position=new int[6];
- public static String ImportColor(String[] SideColors)
- {
- try
- {
- int Check[]={0,0,0,0,0,0};
- for(int i=0;i<6;i++)
- {
- String szColors=SideColors[i];
- if(szColors.length()!=9) return "len(Side"+i+")="+szColors.length();
- for(int j=0;j<9;j++)
- {
- int nColor=Color.Value(szColors.substring(j,j+1));
- if(nColor==0) return "Side"+i+","+j+"="+szColors.substring(j,j+1);
- int y=j%3;
- int x=(j-y)/3;
- Check[nColor-1]++;
- Sides[i][x][y]=nColor;
- if(j==4) Position[i]=nColor;
- }
- }
- for(int i=0;i<6;i++)
- {
- if(Check[i]!=9) return "Check"+i+"="+Check[i];
- }
- return "";
- }
- catch(Exception e)
- {
- return e.getMessage();
- }
- }
- public static void ChangeViewToColor(int nColor) throws Exception
- {
- int nNewCenter=-1;
- for(int i=0;i<6;i++)
- {
- if(Sides[i][1][1]==nColor) nNewCenter=i;
- }
- if(nNewCenter==0) return;
- if(nNewCenter==1)
- {
- CopyMatrics(0,6,0);
- CopyMatrics(1,0,0);
- CopyMatrics(2,1,0);
- CopyMatrics(3,2,0);
- CopyMatrics(6,3,0);
- CopyMatrics(5,6,0);
- CopyMatrics(6,5,1);
- CopyMatrics(4,6,0);
- CopyMatrics(6,4,2);
- }
- if(nNewCenter==2)
- {
- CopyMatrics(0,6,0);
- CopyMatrics(2,0,0);
- CopyMatrics(6,2,0);
- CopyMatrics(1,6,0);
- CopyMatrics(3,1,0);
- CopyMatrics(6,3,0);
- CopyMatrics(5,6,0);
- CopyMatrics(6,5,3);
- CopyMatrics(4,6,0);
- CopyMatrics(6,4,3);
- }
- if(nNewCenter==3)
- {
- CopyMatrics(0,6,0);
- CopyMatrics(3,0,0);
- CopyMatrics(2,3,0);
- CopyMatrics(1,2,0);
- CopyMatrics(6,1,0);
- CopyMatrics(5,6,0);
- CopyMatrics(6,5,2);
- CopyMatrics(4,6,0);
- CopyMatrics(6,4,1);
- }
- if(nNewCenter==4)
- {
- CopyMatrics(0,6,0);
- CopyMatrics(4,0,0);
- CopyMatrics(2,4,3);
- CopyMatrics(5,2,3);
- CopyMatrics(6,5,0);
- CopyMatrics(3,6,0);
- CopyMatrics(6,3,2);
- CopyMatrics(1,6,0);
- CopyMatrics(6,1,1);
- }
- if(nNewCenter==5)
- {
- CopyMatrics(0,6,0);
- CopyMatrics(5,0,0);
- CopyMatrics(2,5,3);
- CopyMatrics(4,2,3);
- CopyMatrics(6,4,0);
- CopyMatrics(3,6,0);
- CopyMatrics(6,3,1);
- CopyMatrics(1,6,0);
- CopyMatrics(6,1,2);
- }
- }
- public static void CopyMatrics(int A, int B, int n) throws Exception
- {
- //Copy from A to B
- //n=0:DirectCopy 1:ClockWiseCopy 2:AntiClockCop 3:Reverse copy
- for(int i=0;i<3;i++)
- {
- for(int j=0;j<3;j++)
- {
- if(n==0) Sides[B][i][j]=Sides[A][i][j];
- if(n==1) Sides[B][j][2-i]=Sides[A][i][j];
- if(n==2) Sides[B][2-j][i]=Sides[A][i][j];
- if(n==3) Sides[B][i][j]=Sides[A][2-i][2-j];
- }
- }
- }
- public static void ChangeViewFromTopByNextColor(int nColor) throws Exception
- {
- int nNextColorCenter=-1;
- for(int i=0;i<6;i++)
- {
- if(Sides[i][1][1]==nColor) nNextColorCenter=i;
- }
- if(nNextColorCenter==4) ChangeViewFromTop(false);
- if(nNextColorCenter==5) ChangeViewFromTop(true);
- if(nNextColorCenter==3)
- {
- ChangeViewFromTop(true);
- ChangeViewFromTop(true);
- }
- }
- public static void ChangeViewFromTop(boolean ClockWise) throws Exception
- {
- int Next1=3,Next2=1;
- if(!ClockWise) {Next1=1;Next2=3;}
- int nType=ClockWise?1:2;
- CopyMatrics(0,6,0);
- CopyMatrics(6,0,nType);
- CopyMatrics(5,6,0);
- CopyMatrics(Next1,5,nType);
- CopyMatrics(4,Next1,nType);
- CopyMatrics(Next2,4,nType);
- CopyMatrics(6,Next2,nType);
- CopyMatrics(2,6,0);
- CopyMatrics(6,2,3-nType);
- }
- public static void RotateBottomSide(boolean ClockWise) throws Exception
- {
- int temp=0;
- int i;
- CopyMatrics(2,6,ClockWise?2:1); //Bottom ClockWise = Top Anti-ClockWise
- CopyMatrics(6,2,0);
- if(ClockWise)
- {
- for(i=0;i<3;i++)
- {
- temp=Sides[5][0][i];
- Sides[5][0][i]=Sides[3][2-i][0];
- Sides[3][2-i][0]=Sides[4][2][2-i];
- Sides[4][2][2-i]=Sides[1][i][2];
- Sides[1][i][2]=temp;
- }
- }
- else
- {
- for(i=0;i<3;i++)
- {
- temp=Sides[5][0][i];
- Sides[5][0][i]=Sides[1][i][2];
- Sides[1][i][2]=Sides[4][2][2-i];
- Sides[4][2][2-i]=Sides[3][2-i][0];
- Sides[3][2-i][0]=temp;
- }
- }
- }
- public static void RotateRealSide(int nColor, boolean ClockWise, int nQuarter) throws Exception
- {
- //ClockWise means AntiClockWise from Top, and nCount>0 in Robot Class
- int nCenter=-1;
- int[] arOpposite={2,3,0,1,5,4};
- for(int i=0;i<6;i++)
- {
- if(Position[i]==nColor) nCenter=i;
- }
- int nOppositeColor=Position[arOpposite[nCenter]];
- if(nCenter==2)
- {
- //Do Nothing
- }
- if(nCenter==1)
- {
- RotatePaw();
- }
- if(nCenter==0)
- {
- RotatePaw();
- RotatePaw();
- }
- if(nCenter==3)
- {
- RotateBottom(false);
- RotateBottom(false);
- RotatePaw();
- }
- if(nCenter==4)
- {
- RotateBottom(false);
- RotatePaw();
- }
- if(nCenter==5)
- {
- RotateBottom(true);
- RotatePaw();
- }
- ChangeViewToColor(nOppositeColor);
- for(int i=0;i<nQuarter;i++)
- {
- RotateBottomSide(!ClockWise);
- }
- }
- public static void RotateBottom(boolean ClockWise) throws Exception
- {
- if(ClockWise)
- {
- int n=Position[5];
- Position[5]=Position[3];
- Position[3]=Position[4];
- Position[4]=Position[1];
- Position[1]=n;
- }
- else
- {
- int n=Position[5];
- Position[5]=Position[1];
- Position[1]=Position[4];
- Position[4]=Position[3];
- Position[3]=n;
- }
- }
- public static void RotatePaw() throws Exception
- {
- //Only can move forward
- int n=Position[0];
- Position[0]=Position[3];
- Position[3]=Position[2];
- Position[2]=Position[1];
- Position[1]=n;
- }
- public static int FindCenter(int nColor) throws Exception
- {
- int nCenter=-1;
- for(int i=0;i<6;i++)
- {
- if(Sides[i][1][1]==nColor) nCenter=i;
- }
- return nCenter;
- }
- public static int FindCornerCell(int Color1, int Color2, int Color3)
- {
- //return value=nLayer*1000+nFirstColorCenter*100+nSecondColorCenter*10+nThirdCenter
- int nReturn=0;
- int nCheck=Color1*100+Color2*10+Color3;
- //First Layer
- if(nReturn==0) nReturn=CheckCorner(nCheck,Sides[0][0][2],Sides[5][2][2],Sides[1][0][0],0,5,1);
- if(nReturn==0) nReturn=CheckCorner(nCheck,Sides[0][0][0],Sides[5][2][0],Sides[3][0][2],0,5,3);
- if(nReturn==0) nReturn=CheckCorner(nCheck,Sides[0][2][0],Sides[4][0][0],Sides[3][2][2],0,4,3);
- if(nReturn==0) nReturn=CheckCorner(nCheck,Sides[0][2][2],Sides[4][0][2],Sides[1][2][0],0,4,1);
- if(nReturn>0) return 1000+nReturn;
- if(nReturn==0) nReturn=CheckCorner(nCheck,Sides[2][0][0],Sides[5][0][2],Sides[1][0][2],2,5,1);
- if(nReturn==0) nReturn=CheckCorner(nCheck,Sides[2][0][2],Sides[5][0][0],Sides[3][0][0],2,5,3);
- if(nReturn==0) nReturn=CheckCorner(nCheck,Sides[2][2][2],Sides[4][2][0],Sides[3][2][0],2,4,3);
- if(nReturn==0) nReturn=CheckCorner(nCheck,Sides[2][2][0],Sides[4][2][2],Sides[1][2][2],2,4,1);
- if(nReturn>0) return 2000+nReturn;
- return 0;
- }
- public static int CheckCorner(int CheckValue, int c1, int c2, int c3, int p1, int p2, int p3)
- {
- if(c1*100+c2*10+c3 == CheckValue) return p1*100+p2*10+p3;
- if(c1*100+c3*10+c2 == CheckValue) return p1*100+p3*10+p2;
- if(c2*100+c1*10+c3 == CheckValue) return p2*100+p1*10+p3;
- if(c2*100+c3*10+c1 == CheckValue) return p2*100+p3*10+p1;
- if(c3*100+c1*10+c2 == CheckValue) return p3*100+p1*10+p2;
- if(c3*100+c2*10+c1 == CheckValue) return p3*100+p2*10+p1;
- return 0;
- }
- public static int FindBorderCell(int Color1, int Color2)
- {
- //return value=nLayer*100+nFirstColorCenter*10+nSecondColorCenter
- int nReturn=0;
- int c1=0,c2=0;
- //First layer
- c1=Sides[0][0][1]; c2=Sides[5][2][1];
- if(c1==Color1 && c2==Color2) return 105;
- if(c1==Color2 && c2==Color1) return 150;
- c1=Sides[0][1][0]; c2=Sides[3][1][2];
- if(c1==Color1 && c2==Color2) return 103;
- if(c1==Color2 && c2==Color1) return 130;
- c1=Sides[0][2][1]; c2=Sides[4][0][1];
- if(c1==Color1 && c2==Color2) return 104;
- if(c1==Color2 && c2==Color1) return 140;
- c1=Sides[0][1][2]; c2=Sides[1][1][0];
- if(c1==Color1 && c2==Color2) return 101;
- if(c1==Color2 && c2==Color1) return 110;
- //Seconde Layer
- c1=Sides[4][1][2]; c2=Sides[1][2][1];
- if(c1==Color1 && c2==Color2) return 241;
- if(c1==Color2 && c2==Color1) return 214;
- c1=Sides[4][1][0]; c2=Sides[3][2][1];
- if(c1==Color1 && c2==Color2) return 243;
- if(c1==Color2 && c2==Color1) return 234;
- c1=Sides[5][1][0]; c2=Sides[3][0][1];
- if(c1==Color1 && c2==Color2) return 253;
- if(c1==Color2 && c2==Color1) return 235;
- c1=Sides[5][1][2]; c2=Sides[1][0][1];
- if(c1==Color1 && c2==Color2) return 251;
- if(c1==Color2 && c2==Color1) return 215;
- //Third Layer
- c1=Sides[4][2][1]; c2=Sides[2][2][1];
- if(c1==Color1 && c2==Color2) return 342;
- if(c1==Color2 && c2==Color1) return 324;
- c1=Sides[1][1][2]; c2=Sides[2][1][0];
- if(c1==Color1 && c2==Color2) return 312;
- if(c1==Color2 && c2==Color1) return 321;
- c1=Sides[5][0][1]; c2=Sides[2][0][1];
- if(c1==Color1 && c2==Color2) return 352;
- if(c1==Color2 && c2==Color1) return 325;
- c1=Sides[3][1][0]; c2=Sides[2][1][2];
- if(c1==Color1 && c2==Color2) return 332;
- if(c1==Color2 && c2==Color1) return 323;
- return 0;
- }
- }
- public static class Steps
- {
- public static int Count=0;
- public static int Index=-1;
- private static int[] arColor=new int[200];
- private static boolean[] arClockWise=new boolean[200];
- private static int[] arQuarter=new int[200];
- public static void Clear()
- {
- Count=0;
- Index=-1;
- }
- public static void AddStep(int SideNum, boolean ClockWise, int Quarter)
- {
- arColor[Count]=Rubik.Sides[SideNum][1][1];
- arClockWise[Count]=ClockWise;
- arQuarter[Count]=Quarter;
- Count++;
- }
- public static int Color()
- {
- return arColor[Index];
- }
- public static boolean ClockWise()
- {
- return arClockWise[Index];
- }
- public static int Quarter()
- {
- return arQuarter[Index];
- }
- }
- public static class Color
- {
- public static int Y=1;
- public static int B=2;
- public static int R=3;
- public static int W=4;
- public static int O=5;
- public static int G=6;
- public static String Text(int n)
- {
- switch(n)
- {
- case 1:
- return "Y";
- case 2:
- return "B";
- case 3:
- return "R";
- case 4:
- return "W";
- case 5:
- return "O";
- case 6:
- return "G";
- default:
- return n+"";
- }
- }
- public static int Value(String c)
- {
- if(c.equals("Y")||c.equals("y")) return 1;
- if(c.equals("B")||c.equals("b")) return 2;
- if(c.equals("R")||c.equals("r")) return 3;
- if(c.equals("W")||c.equals("w")) return 4;
- if(c.equals("O")||c.equals("o")) return 5;
- if(c.equals("G")||c.equals("g")) return 6;
- return 0;
- }
- }
- }
魔方CFOP算法java实现
最新推荐文章于 2022-11-10 13:27:40 发布