本帖最后由 51黑黑 于 2016-1-6 02:36 編輯
兩年前寫了魔方的操作框架,這次把魔方求解也做出來準備用到C寫的所以即可以很方便的移植到單片機上做解魔方機器人的核心算法,也可以直接在PC上運行然后通過數據線控制機械機構來操作。
對魔方的解法也不是很精通所以用的最基本的十字解法來實現的,解魔方步驟一般會有100多步
 - #include <iostream>
- #include <stdlib.h>
- //數據結構:
- typedef enum colors
- {white=1,blue,red,green,orange,yellow}Colors;//6種顏色
- typedef struct surface
- {
- Colors s[4][4];
- }Surface;//每個面有3*3個小格,從下標1開始表示,每一面的顏色是固定的
- typedef struct cube
- {
- Surface up,down,front,back,left,right;
- }Cube;//魔方的6個面
- typedef struct snode
- {
- char *chbuf;
- int times;
- struct snode *next;
- }SNode;
- typedef struct sequence
- {
- SNode *head;//存儲魔方轉換序列
- int num;//魔方轉換的次數
- }Sequence;
- Sequence CD;
- //程序:
- void SaveChBuf(char *sur,int i)//將cb序列存入chbuf中
- {
- char *str;
- int len=strlen(sur);
- SNode *p,*q;
- if(i%4)
- {
- str=(char *)malloc(sizeof(char)*(len+2));
- if(!str)
- {
- printf("內存不足!\n");
- exit(0);
- }
- strcpy(str,sur);
- q=(SNode *)malloc(sizeof(SNode));
- if(!q)
- {
- printf("內存不足!\n");
- exit(0);
- }
- q->chbuf=str;
- q->times=i;
- q->next=NULL;
- if(CD.head==NULL)
- {
- CD.head=q;
- CD.num++;
- }
- else
- {
- for(p=CD.head;p->next;p=p->next);
- if(!strcmp(p->chbuf,q->chbuf))
- {
- p->times=(p->times+q->times)%4;
- free(q->chbuf);free(q);
- if(!(p->times))
- {
- if(p==CD.head)
- {
- CD.head=NULL;
- free(p->chbuf);free(p);
- CD.num--;
- }
- else
- {
- for(q=CD.head;q->next!=p;q=q->next);
- q->next=NULL;
- free(p->chbuf);free(p);
- CD.num--;
- }
- }
- }
- else
- {
- p->next=q;
- CD.num++;
- }
- }
- }
- }
- void clockwise(Surface *sur,int i)//將sur面順時針旋轉i次
- {
- Surface t;
- for(;i>0;i--)
- {
- t=*sur;
- sur->s[1][1]=t.s[3][1];
- sur->s[1][2]=t.s[2][1];
- sur->s[1][3]=t.s[1][1];
- sur->s[2][1]=t.s[3][2];
- sur->s[2][2]=t.s[2][2];
- sur->s[2][3]=t.s[1][2];
- sur->s[3][1]=t.s[3][3];
- sur->s[3][2]=t.s[2][3];
- sur->s[3][3]=t.s[1][3];
- }
- }
- void F(Cube *m,int i)//將魔方的正面順時針轉i次
- {
- Cube n;
- for(;i>0;i--)
- {
- n=*m;
- clockwise(&m->front,1);
- m->right.s[1][1]=n.up.s[3][1];
- m->right.s[2][1]=n.up.s[3][2];
- m->right.s[3][1]=n.up.s[3][3];
- m->down.s[1][1]=n.right.s[3][1];
- m->down.s[1][2]=n.right.s[2][1];
- m->down.s[1][3]=n.right.s[1][1];
- m->left.s[1][3]=n.down.s[1][1];
- m->left.s[2][3]=n.down.s[1][2];
- m->left.s[3][3]=n.down.s[1][3];
- m->up.s[3][1]=n.left.s[3][3];
- m->up.s[3][2]=n.left.s[2][3];
- m->up.s[3][3]=n.left.s[1][3];
- }
- }
- void B(Cube *m,int i)//將魔方的背面順時針轉i次
- {
- Cube n;
- for(;i>0;i--)
- {
- n=*m;
- clockwise(&m->back,1);
- m->right.s[1][3]=n.down.s[3][3];
- m->right.s[2][3]=n.down.s[3][2];
- m->right.s[3][3]=n.down.s[3][1];
- m->down.s[3][1]=n.left.s[1][1];
- m->down.s[3][2]=n.left.s[2][1];
- m->down.s[3][3]=n.left.s[3][1];
- m->left.s[1][1]=n.up.s[1][3];
- m->left.s[2][1]=n.up.s[1][2];
- m->left.s[3][1]=n.up.s[1][1];
- m->up.s[1][1]=n.right.s[1][3];
- m->up.s[1][2]=n.right.s[2][3];
- m->up.s[1][3]=n.right.s[3][3];
- }
- }
- void R(Cube *m,int i)//將魔方的右面順時針轉i次
- {
- Cube n;
- for(;i>0;i--)
- {
- n=*m;
- clockwise(&m->right,1);
- m->up.s[1][3]=n.front.s[1][3];
- m->up.s[2][3]=n.front.s[2][3];
- m->up.s[3][3]=n.front.s[3][3];
- m->front.s[1][3]=n.down.s[1][3];
- m->front.s[2][3]=n.down.s[2][3];
- m->front.s[3][3]=n.down.s[3][3];
- m->down.s[1][3]=n.back.s[3][1];
- m->down.s[2][3]=n.back.s[2][1];
- m->down.s[3][3]=n.back.s[1][1];
- m->back.s[3][1]=n.up.s[1][3];
- m->back.s[2][1]=n.up.s[2][3];
- m->back.s[1][1]=n.up.s[3][3];
- }
- }
- void L(Cube *m,int i)//將魔方的左面順時針轉i次
- {
- Cube n;
- for(;i>0;i--)
- {
- n=*m;
- clockwise(&m->left,1);
- m->up.s[1][1]=n.back.s[3][3];
- m->up.s[2][1]=n.back.s[2][3];
- m->up.s[3][1]=n.back.s[1][3];
- m->back.s[1][3]=n.down.s[3][1];
- m->back.s[2][3]=n.down.s[2][1];
- m->back.s[3][3]=n.down.s[1][1];
- m->down.s[1][1]=n.front.s[1][1];
- m->down.s[2][1]=n.front.s[2][1];
- m->down.s[3][1]=n.front.s[3][1];
- m->front.s[1][1]=n.up.s[1][1];
- m->front.s[2][1]=n.up.s[2][1];
- m->front.s[3][1]=n.up.s[3][1];
- }
- }
- void U(Cube *m,int i)//將魔方的上面順時針轉i次
- {
- Cube n;
- for(;i>0;i--)
- {
- n=*m;
- clockwise(&m->up,1);
- m->front.s[1][1]=n.right.s[1][1];
- m->front.s[1][2]=n.right.s[1][2];
- m->front.s[1][3]=n.right.s[1][3];
- m->right.s[1][1]=n.back.s[1][1];
- m->right.s[1][2]=n.back.s[1][2];
- m->right.s[1][3]=n.back.s[1][3];
- m->back.s[1][1]=n.left.s[1][1];
- m->back.s[1][2]=n.left.s[1][2];
- m->back.s[1][3]=n.left.s[1][3];
- m->left.s[1][1]=n.front.s[1][1];
- m->left.s[1][2]=n.front.s[1][2];
- m->left.s[1][3]=n.front.s[1][3];
- }
- }
- void D(Cube *m,int i)//將魔方的底面順時針轉i次
- {
- Cube n;
- for(;i>0;i--)
- {
- n=*m;
- clockwise(&m->down,1);
- m->front.s[3][1]=n.left.s[3][1];
- m->front.s[3][2]=n.left.s[3][2];
- m->front.s[3][3]=n.left.s[3][3];
- m->left.s[3][1]=n.back.s[3][1];
- m->left.s[3][2]=n.back.s[3][2];
- m->left.s[3][3]=n.back.s[3][3];
- m->back.s[3][1]=n.right.s[3][1];
- m->back.s[3][2]=n.right.s[3][2];
- m->back.s[3][3]=n.right.s[3][3];
- m->right.s[3][1]=n.front.s[3][1];
- m->right.s[3][2]=n.front.s[3][2];
- m->right.s[3][3]=n.front.s[3][3];
- }
- }
- void MR(Cube *m,int i)//將魔方的左面和右面之間的面以右面為基準順時針旋轉1次
- {
- Cube n;
- for(;i>0;i--)
- {
- n=*m;
- m->up.s[1][2]=n.front.s[1][2];
- m->up.s[2][2]=n.front.s[2][2];
- m->up.s[3][2]=n.front.s[3][2];
- m->front.s[1][2]=n.down.s[1][2];
- m->front.s[2][2]=n.down.s[2][2];
- m->front.s[3][2]=n.down.s[3][2];
- m->down.s[1][2]=n.back.s[3][2];
- m->down.s[2][2]=n.back.s[2][2];
- m->down.s[3][2]=n.back.s[1][2];
- m->back.s[3][2]=n.up.s[1][2];
- m->back.s[2][2]=n.up.s[2][2];
- m->back.s[1][2]=n.up.s[3][2];
- }
- }
- void MF(Cube *m,int i)//將魔方的前面和后面之間的面以前面為基準順時針旋轉i次
- {
- Cube n;
- for(;i>0;i--)
- {
- n=*m;
- m->right.s[1][2]=n.up.s[2][1];
- m->right.s[2][2]=n.up.s[2][2];
- m->right.s[3][2]=n.up.s[2][3];
- m->up.s[2][1]=n.left.s[3][2];
- m->up.s[2][2]=n.left.s[2][2];
- m->up.s[2][3]=n.left.s[1][2];
- m->left.s[1][2]=n.down.s[2][1];
- m->left.s[2][2]=n.down.s[2][2];
- m->left.s[3][2]=n.down.s[2][3];
- m->down.s[2][1]=n.right.s[3][2];
- m->down.s[2][2]=n.right.s[2][2];
- m->down.s[2][3]=n.right.s[1][2];
- }
- }
- void MU(Cube *m,int i)//將魔方的上面和底面之間的面以上面為基準順時針旋轉i次
- {
- Cube n;
- for(;i>0;i--)
- {
- n=*m;
- m->front.s[2][1]=n.right.s[2][1];
- m->front.s[2][2]=n.right.s[2][2];
- m->front.s[2][3]=n.right.s[2][3];
- m->right.s[2][1]=n.back.s[2][1];
- m->right.s[2][2]=n.back.s[2][2];
- m->right.s[2][3]=n.back.s[2][3];
- m->back.s[2][1]=n.left.s[2][1];
- m->back.s[2][2]=n.left.s[2][2];
- m->back.s[2][3]=n.left.s[2][3];
- m->left.s[2][1]=n.front.s[2][1];
- m->left.s[2][2]=n.front.s[2][2];
- m->left.s[2][3]=n.front.s[2][3];
- }
- }
- void MoveCube(Cube *m,char *sur,int i)//根據序列cb轉換魔方m
- {
- SaveChBuf(sur,i);//將魔方轉換序列存入chbuf中
- if(!strcmp(sur,"f"))
- F(m,i);//將魔方的正面順時針旋轉i次
- if(!strcmp(sur,"b"))
- B(m,i);//將魔方的背面順時針旋轉i次
- if(!strcmp(sur,"r"))
- R(m,i);//將魔方的右面順時針旋轉i次
- if(!strcmp(sur,"l"))
- L(m,i);//將魔方的左面順時針旋轉i次
- if(!strcmp(sur,"u"))
- U(m,i);//將魔方的上面順時針旋轉i次
- if(!strcmp(sur,"d"))
- D(m,i);//將魔方的底面順時針旋轉i次
- if(!strcmp(sur,"mr"))
- MR(m,i);//將魔方的左面和右面之間的面以右面為基準順時針旋轉i次
- if(!strcmp(sur,"mf"))
- MF(m,i);//將魔方的前面和后面之間的面以前面為基準順時針旋轉i次
- if(!strcmp(sur,"mu"))
- MU(m,i);//將魔方的上面和底面之間的面以上面為基準順時針旋轉i次
- }
- void InputSurface(Surface *sur)
- {
- int i,j,a;
- for(i=1;i<=3;i++)
- for(j=1;j<=3;j++)
- {
- scanf("%d",&a);
- sur->s[i][j]=(Colors)a;
- }
- }
- void Input(Cube *magiccube)//存儲魔方
- {
- printf("獲取魔方每個面的顏色值:\n");
- printf("Blue--------1\tRed---------2\tYellow------3\n");
- printf("Green-------4\tWhite-------5\tOrange------6\n\n");
- printf("獲取頂面(UP)顏色值:\n");
- InputSurface(&(magiccube->up));//儲存頂面
- printf("獲取底面(Down)顏色值:\n");
- InputSurface(&(magiccube->down));//儲存底面
- printf("獲取前面(Front)顏色值:\n");
- InputSurface(&(magiccube->front));//儲存前面
- printf("獲取后面(Back)顏色值:\n");
- InputSurface(&(magiccube->back));//儲存后面
- printf("獲取左面(Left)顏色值:\n");
- InputSurface(&(magiccube->left));//儲存左面
- printf("獲取右面(Right)顏色值:\n");
- InputSurface(&(magiccube->right));//儲存右面
- }
- void DownCross(Cube *magiccube)//將底面拼出一個十字
- {
- while(!((magiccube->down.s[1][2]==magiccube->down.s[2][2]&&magiccube->front.s[3][2]==magiccube->front.s[2][2])
- &&(magiccube->down.s[2][1]==magiccube->down.s[2][2]&&magiccube->left.s[3][2]==magiccube->left.s[2][2])
- &&(magiccube->down.s[2][3]==magiccube->down.s[2][2]&&magiccube->right.s[3][2]==magiccube->right.s[2][2])
- &&(magiccube->down.s[3][2]==magiccube->down.s[2][2]&&magiccube->back.s[3][2]==magiccube->back.s[2][2])))
- {
- Surface *sur[4]={&magiccube->front,&magiccube->left,&magiccube->back,&magiccube->right};
- char *s[4]={"f","l","b","r"};
- int subscript_of_down[4][2]={{1,2},{2,1},{3,2},{2,3}};
- int subscript_of_up[4][2]={{3,2},{2,1},{1,2},{2,3}};
- char ch[3];
- int n;
- for(int i=0;i<4;i++)
- {
- if(magiccube->down.s[subscript_of_down[i][0]][subscript_of_down[i][1]]==magiccube->down.s[2][2]
- &&sur[i]->s[3][2]!=sur[i]->s[2][2])
- {
- strcpy(ch,s[i]);
- MoveCube(magiccube,ch,2);
- }//底面棱塊為底面色位置不對
- if(magiccube->up.s[subscript_of_up[i][0]][subscript_of_up[i][1]]==magiccube->down.s[2][2])
- {
- n=0;
- while(sur[(i+n)%4]->s[2][2]!=sur[(i+n)%4]->s[1][2])
- {
- MoveCube(magiccube,"u",1);
- n++;
- }
- strcpy(ch,s[(i+n)%4]);
- MoveCube(magiccube,ch,2);
- }//以上是底面棱塊在頂面的情況
- if(sur[i]->s[1][2]==magiccube->down.s[2][2])//側面上棱是底面色的情況
- {
- n=0;
- while(sur[(i+n+1)%4]->s[2][2]!=magiccube->up.s[subscript_of_up[(i+n)%4][0]][subscript_of_up[(i+n)%4][1]])
- {
- MoveCube(magiccube,"u",1);
- n++;
- }
- strcpy(ch,s[(i+n)%4]);
- MoveCube(magiccube,ch,3);
- strcpy(ch,s[(n+1+i)%4]);
- MoveCube(magiccube,ch,1);
- strcpy(ch,s[(i+n)%4]);
- MoveCube(magiccube,ch,1);
- }
- if(sur[i]->s[2][1]==magiccube->down.s[2][2])//側面左棱是底面色的情況
- {
- strcpy(ch,s[(i+1)%4]);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,1);
- }
- if(sur[i]->s[2][3]==magiccube->down.s[2][2])//側面右棱是底面色的情況
- {
- strcpy(ch,s[(i+3)%4]);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,3);
- }
- if(sur[i]->s[3][2]==magiccube->down.s[2][2])//側面底棱是底面色的情況
- {
- strcpy(ch,s[i]);
- MoveCube(magiccube,ch,1);
- strcpy(ch,s[(i+1)%4]);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,1);
- strcpy(ch,s[i]);
- MoveCube(magiccube,ch,3);
- }//以上是側面棱塊色是底面色的情況
- }
- }
- }
- void DownCornerRestore(Cube *magiccube)//底角還原
- {
- while(!((magiccube->down.s[1][1]==magiccube->down.s[2][2]&&magiccube->front.s[3][1]==magiccube->front.s[2][2]&&magiccube->left.s[3][3]==magiccube->left.s[2][2])
- &&(magiccube->down.s[1][3]==magiccube->down.s[2][2]&&magiccube->front.s[3][3]==magiccube->front.s[2][2]&&magiccube->right.s[3][1]==magiccube->right.s[2][2])
- &&(magiccube->down.s[3][1]==magiccube->down.s[2][2]&&magiccube->right.s[3][1]==magiccube->right.s[2][2]&&magiccube->back.s[3][3]==magiccube->back.s[2][2])
- &&(magiccube->down.s[3][3]==magiccube->down.s[2][2]&&magiccube->back.s[3][1]==magiccube->back.s[2][2]&&magiccube->right.s[3][3]==magiccube->right.s[2][2])))//直到底角全部歸位
- {
- Surface *sur[4]={&magiccube->front,&magiccube->left,&magiccube->back,&magiccube->right};
- char *s[4]={"f","l","b","r"};
- int subscript_of_down[4][2]={{1,1},{3,1},{3,3},{1,3}};
- int subscript_of_up[4][2]={{3,1},{1,1},{1,3},{3,3}};
- char ch[3];
- int n;
- for(int i=0;i<4;i++)
- {
- if(magiccube->down.s[subscript_of_down[i][0]][subscript_of_down[i][1]]==magiccube->down.s[2][2]&&
- (sur[i]->s[3][1]!=sur[i]->s[2][2]||sur[(i+1)%4]->s[3][3]!=sur[(i+1)%4]->s[2][2]))
- {
- strcpy(ch,s[i]);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,3);
- }//底面角塊顏色歸位但是位置不對
- if(magiccube->up.s[subscript_of_up[i][0]][subscript_of_up[i][1]]==magiccube->down.s[2][2])
- {
- n=0;
- while(sur[(i+n)%4]->s[1][1]!=sur[(i+n+1)%4]->s[2][2])
- {
- MoveCube(magiccube,"u",1);
- n++;
- }
- strcpy(ch,s[(i+n)%4]);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",3);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",2);
- }//頂面有底角色塊的情況
- if(sur[i]->s[1][1]==magiccube->down.s[2][2])//側面左上角是底面色的情況
- {
- n=0;
- while(sur[(i+n+1)%4]->s[2][2]!=sur[(i+n+1)%4]->s[1][3])
- {
- MoveCube(magiccube,"u",1);
- n++;
- }
- strcpy(ch,s[(n+i)%4]);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,3);
- }
- if(sur[i]->s[1][3]==magiccube->down.s[2][2])//側面右上角是底面色的情況
- {
- n=0;
- while(sur[(i+n+3)%4]->s[2][2]!=sur[(i+n+3)%4]->s[1][1])
- {
- MoveCube(magiccube,"u",1);
- n++;
- }
- strcpy(ch,s[(n+i)%4]);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",3);
- MoveCube(magiccube,ch,1);
- }
- if(sur[i]->s[3][1]==magiccube->down.s[2][2])//側面左下角是底面色的情況
- {
- strcpy(ch,s[i]);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,3);
- }
- if(sur[i]->s[3][3]==magiccube->down.s[2][2])//側面右下角是底面色的情況
- {
- strcpy(ch,s[i]);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",3);
- MoveCube(magiccube,ch,1);
- }//側面有底面色塊
- }
- }
- }
- void CentreEdgeRestore(Cube *magiccube)//中棱歸位
- {
- while(!((magiccube->front.s[2][1]==magiccube->front.s[2][2]&&magiccube->front.s[2][3]==magiccube->front.s[2][2])
- &&(magiccube->left.s[2][1]==magiccube->left.s[2][2]&&magiccube->left.s[2][3]==magiccube->left.s[2][2])
- &&(magiccube->back.s[2][1]==magiccube->back.s[2][2]&&magiccube->back.s[2][3]==magiccube->back.s[2][2])
- &&(magiccube->right.s[2][1]==magiccube->right.s[2][2]&&magiccube->right.s[2][3]==magiccube->right.s[2][2])))
- {
- Surface *sur[4]={&magiccube->front,&magiccube->left,&magiccube->back,&magiccube->right};
- char *s[4]={"f","l","b","r"};
- int subscript_of_up[4][2]={{3,2},{2,1},{1,2},{2,3}};
- char ch[3];
- int n;
- for(int i=0;i<4;i++)
- {
- if(!(sur[i]->s[2][1]==sur[i]->s[2][2]&&sur[(i+1)%4]->s[2][3]==sur[(i+1)%4]->s[2][2])
- &&(sur[i]->s[2][1]!=magiccube->up.s[2][2]&&sur[(i+1)%4]->s[2][3]!=magiccube->up.s[2][2]))
- {
- strcpy(ch,s[i]);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",3);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",3);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",2);
- }
- if(sur[i]->s[1][2]!=magiccube->up.s[2][2]
- &&magiccube->up.s[subscript_of_up[i][0]][subscript_of_up[i][1]]!=magiccube->up.s[2][2])
- {
- n=0;
- while(sur[(i+n)%4]->s[1][2]!=sur[(i+n)%4]->s[2][2])
- {
- n++;
- MoveCube(magiccube,"u",1);
- }
- if(magiccube->up.s[subscript_of_up[(i+n)%4][0]][subscript_of_up[(i+n)%4][1]]==sur[(i+n+3)%4]->s[2][2])
- {
- strcpy(ch,s[(i+n)%4]);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",3);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",3);
- MoveCube(magiccube,ch,3);
- }
- if(magiccube->up.s[subscript_of_up[(i+n)%4][0]][subscript_of_up[(i+n)%4][1]]==sur[(i+n+1)%4]->s[2][2])
- {
- strcpy(ch,s[(i+n)%4]);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",3);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",3);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,1);
- }
- }
- }
- }
- }
- void UpCross(Cube *magiccube)//頂面十字
- {
- while(!(magiccube->up.s[1][2]==magiccube->up.s[2][2]&&magiccube->up.s[2][1]==magiccube->up.s[2][2]
- &&magiccube->up.s[2][3]==magiccube->up.s[2][2]&&magiccube->up.s[3][2]==magiccube->up.s[2][2]))
- {
- Surface *sur[4]={&magiccube->front,&magiccube->left,&magiccube->back,&magiccube->right};
- char *s[4]={"f","l","b","r"};
- int subscript_of_up[4][2]={{3,2},{2,1},{1,2},{2,3}};
- char ch[3];
- if(magiccube->up.s[1][2]!=magiccube->up.s[2][2]&&magiccube->up.s[2][1]!=magiccube->up.s[2][2]
- &&magiccube->up.s[2][3]!=magiccube->up.s[2][2]&&magiccube->up.s[3][2]!=magiccube->up.s[2][2])
- {
- MoveCube(magiccube,"f",1);
- MoveCube(magiccube,"r",1);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,"r",3);
- MoveCube(magiccube,"u",3);
- MoveCube(magiccube,"f",3);
- }
- for(int i=0;i<4;i++)
- {
- if(magiccube->up.s[subscript_of_up[(i+1)%4][0]][subscript_of_up[(i+1)%4][1]]==magiccube->up.s[2][2]
- &&magiccube->up.s[subscript_of_up[(i+2)%4][0]][subscript_of_up[(i+2)%4][1]]==magiccube->up.s[2][2]
- &&magiccube->up.s[subscript_of_up[i][0]][subscript_of_up[i][1]]!=magiccube->up.s[2][2]
- &&magiccube->up.s[subscript_of_up[(i+3)%4][0]][subscript_of_up[(i+3)%4][1]]!=magiccube->up.s[2][2])
- {//形成一個倒"L"
- strcpy(ch,s[i]);
- MoveCube(magiccube,ch,1);
- strcpy(ch,s[(i+3)%4]);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",3);
- strcpy(ch,s[i]);
- MoveCube(magiccube,ch,3);
- }
- if(magiccube->up.s[subscript_of_up[(i+1)%4][0]][subscript_of_up[(i+1)%4][1]]==magiccube->up.s[2][2]
- &&magiccube->up.s[subscript_of_up[(i+3)%4][0]][subscript_of_up[(i+3)%4][1]]==magiccube->up.s[2][2]
- &&magiccube->up.s[subscript_of_up[i][0]][subscript_of_up[i][1]]!=magiccube->up.s[2][2]
- &&magiccube->up.s[subscript_of_up[(i+2)%4][0]][subscript_of_up[(i+2)%4][1]]!=magiccube->up.s[2][2])
- {//形成一個橫"一"
- strcpy(ch,s[i]);
- MoveCube(magiccube,ch,1);
- strcpy(ch,s[(i+3)%4]);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",3);
- strcpy(ch,s[i]);
- MoveCube(magiccube,ch,3);
- }
- }
- }
- }
- void UpSurfaceCornerRestore(Cube *magiccube)//頂角面位
- {
- while(!(magiccube->up.s[1][1]==magiccube->up.s[2][2]&&magiccube->up.s[1][3]==magiccube->up.s[2][2]
- &&magiccube->up.s[3][1]==magiccube->up.s[2][2]&&magiccube->up.s[3][3]==magiccube->up.s[2][2]))
- {
- Surface *sur[4]={&magiccube->front,&magiccube->left,&magiccube->back,&magiccube->right};
- char *s[4]={"f","l","b","r"};
- int subscript_of_up[4][2]={{3,1},{1,1},{1,3},{3,3}};
- char ch[3];
- int n;
- for(int i=0;i<4;i++)
- {
- if((magiccube->up.s[1][1]!=magiccube->up.s[2][2]&&magiccube->up.s[1][3]!=magiccube->up.s[2][2]
- &&magiccube->up.s[3][1]!=magiccube->up.s[2][2]&&magiccube->up.s[3][3]!=magiccube->up.s[2][2])
- &&(sur[i]->s[1][1]==magiccube->up.s[2][2]&&sur[i]->s[1][3]==magiccube->up.s[2][2]))
- {//十字型(前左右與上同色)
- n=0;
- while(sur[(i+n)%4]->s[1][2]!=sur[(i+n)%4]->s[2][2])
- {
- MoveCube(magiccube,"u",1);
- n++;
- }
- strcpy(ch,s[(i+n+3)%4]);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",2);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,1);
- }
- if(magiccube->up.s[subscript_of_up[(i+3)%4][0]][subscript_of_up[(i+3)%4][1]]==magiccube->up.s[2][2]
- &&magiccube->up.s[subscript_of_up[i][0]][subscript_of_up[i][1]]!=magiccube->up.s[2][2]
- &&magiccube->up.s[subscript_of_up[(i+1)%4][0]][subscript_of_up[(i+1)%4][1]]!=magiccube->up.s[2][2]
- &&magiccube->up.s[subscript_of_up[(i+2)%4][0]][subscript_of_up[(i+2)%4][1]]!=magiccube->up.s[2][2])
- {//魚頭朝右下的魚
- if(sur[i]->s[1][1]!=magiccube->up.s[2][2])//前左與上異色
- {
- strcpy(ch,s[(i+3)%4]);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",2);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,1);
- }
- else//前左與上同色
- {
- MoveCube(magiccube,"u",3);
- strcpy(ch,s[(i+3)%4]);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",2);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",3);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",3);
- MoveCube(magiccube,ch,3);
- }
- }
- if(magiccube->up.s[subscript_of_up[(i+1)%4][0]][subscript_of_up[(i+1)%4][1]]==magiccube->up.s[2][2]
- &&magiccube->up.s[subscript_of_up[i][0]][subscript_of_up[i][1]]!=magiccube->up.s[2][2]
- &&magiccube->up.s[subscript_of_up[(i+3)%4][0]][subscript_of_up[(i+3)%4][1]]!=magiccube->up.s[2][2]
- &&magiccube->up.s[subscript_of_up[(i+2)%4][0]][subscript_of_up[(i+2)%4][1]]==magiccube->up.s[2][2])
- {//大炮型
- if(sur[i]->s[1][1]==magiccube->up.s[2][2]&&sur[i]->s[1][3]==magiccube->up.s[2][2])
- {//前左右與上同色
- strcpy(ch,s[(i+1)%4]);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",2);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,1);
- }
- else
- {//前左右與上異色
- strcpy(ch,s[(i+2)%4]);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",2);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,1);
- }
- }
- if(magiccube->up.s[subscript_of_up[(i+3)%4][0]][subscript_of_up[(i+3)%4][1]]==magiccube->up.s[2][2]
- &&magiccube->up.s[subscript_of_up[i][0]][subscript_of_up[i][1]]!=magiccube->up.s[2][2]
- &&magiccube->up.s[subscript_of_up[(i+1)%4][0]][subscript_of_up[(i+1)%4][1]]==magiccube->up.s[2][2]
- &&magiccube->up.s[subscript_of_up[(i+2)%4][0]][subscript_of_up[(i+2)%4][1]]!=magiccube->up.s[2][2])
- {//雙凌型
- MoveCube(magiccube,"u",3);
- strcpy(ch,s[(i+3)%4]);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",2);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,1);
- }
- }
- }
- }
- void UpCornerRestore(Cube *magiccube)//頂角還原
- {
- while(magiccube->front.s[1][1]!=magiccube->front.s[2][2])
- MoveCube(magiccube,"u",1);
- while(!((magiccube->front.s[1][1]==magiccube->front.s[2][2]&&magiccube->front.s[1][3]==magiccube->front.s[2][2])
- &&(magiccube->left.s[1][1]==magiccube->left.s[2][2]&&magiccube->left.s[1][3]==magiccube->left.s[2][2])
- &&(magiccube->back.s[1][1]==magiccube->back.s[2][2]&&magiccube->back.s[1][3]==magiccube->back.s[2][2])
- &&(magiccube->right.s[1][1]==magiccube->right.s[2][2]&&magiccube->right.s[1][3]==magiccube->right.s[2][2])))
- {
- Surface *sur[4]={&magiccube->front,&magiccube->left,&magiccube->back,&magiccube->right};
- char *s[4]={"f","l","b","r"};
- int n;
- char ch[3];
- int i;
- for(i=0;i<4;i++)
- {
- n=0;
- if(sur[i]->s[1][1]==sur[i]->s[1][3])
- {
- while(sur[(i+n)%4]->s[1][1]!=sur[(i+n)%4]->s[2][2])
- {
- MoveCube(magiccube,"u",1);
- n++;
- }
- break;
- }
- }
- strcpy(ch,s[(i+n+3)%4]);
- MoveCube(magiccube,ch,1);
- strcpy(ch,s[(i+n+2)%4]);
- MoveCube(magiccube,ch,3);
- strcpy(ch,s[(i+n+3)%4]);
- MoveCube(magiccube,ch,1);
- strcpy(ch,s[(i+n)%4]);
- MoveCube(magiccube,ch,2);
- strcpy(ch,s[(i+n+3)%4]);
- MoveCube(magiccube,ch,3);
- strcpy(ch,s[(i+n+2)%4]);
- MoveCube(magiccube,ch,1);
- strcpy(ch,s[(i+n+3)%4]);
- MoveCube(magiccube,ch,1);
- strcpy(ch,s[(i+n)%4]);
- MoveCube(magiccube,ch,2);
- strcpy(ch,s[(i+n+3)%4]);
- MoveCube(magiccube,ch,2);
- while(magiccube->front.s[1][1]!=magiccube->front.s[2][2])
- MoveCube(magiccube,"u",1);
- }
- }
- void UpEdgeRestore(Cube *magiccube)//頂棱還原
- {
- while(magiccube->front.s[1][1]!=magiccube->front.s[2][2])
- MoveCube(magiccube,"u",1);
- while(!(magiccube->front.s[1][2]==magiccube->front.s[2][2]&&magiccube->left.s[1][2]==magiccube->left.s[2][2]
- &&magiccube->back.s[1][2]==magiccube->back.s[2][2]&&magiccube->right.s[1][2]==magiccube->right.s[2][2]))
- {
- Surface *sur[4]={&magiccube->front,&magiccube->left,&magiccube->back,&magiccube->right};
- char *s[4]={"f","l","b","r"};
- int n;
- char ch[3];
- int i;
- for(i=0;i<4;i++)
- {
- n=0;
- if(sur[i]->s[1][1]==sur[i]->s[1][2]&&sur[i]->s[1][2]==sur[i]->s[1][3])
- {
- while(sur[(i+n)%4]->s[1][1]!=sur[(i+n)%4]->s[2][2])
- {
- MoveCube(magiccube,"u",1);
- n++;
- }
- break;
- }
- }
- strcpy(ch,s[(i+n+1)%4]);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",3);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",1);
- MoveCube(magiccube,ch,1);
- MoveCube(magiccube,"u",3);
- MoveCube(magiccube,ch,3);
- MoveCube(magiccube,"u",3);
- MoveCube(magiccube,ch,2);
- while(magiccube->front.s[1][1]!=magiccube->front.s[2][2])
- MoveCube(magiccube,"u",1);
- }
- }
- void printsurface(Surface sur)//輸出某一面的顏色
- {
- int i,j;
- for(i=1;i<=3;i++)
- {
- for(j=1;j<=3;j++)
- printf("%d ",(int)sur.s[i][j]);
- printf("\n");
- }
- }
- void PrintMagicCube(Cube m)//輸出整個魔方的當前顏色值狀態
- {
- printf("\nUp面顏色值如下:\n");
- printsurface(m.up);
- printf("\nDown面顏色值如下:\n");
- printsurface(m.down);
- printf("\nFront面顏色值如下:\n");
- printsurface(m.front);
- printf("\nBack面顏色值如下:\n");
- printsurface(m.back);
- printf("\nLeft面顏色值如下:\n");
- printsurface(m.left);
- printf("\nRight面顏色值如下:\n");
- printsurface(m.right);
- }
- void PrintBuf()
- {
- SNode *p;
- int i;
- printf("\n還原魔方所用的操作步驟如下:\n");
- for(p=CD.head,i=1;p;p=p->next,i++)
- {
- printf("%s%d\t",p->chbuf,p->times);
- if(i==5)
- {
- putchar('\n');
- printf("------------------------------------\n");
- i=0;
- }
- }
- printf("\n\n本次魔方還原一共進行了%d步!\n",CD.num);
- }
- void InitializationMagiccube(Cube *m)//初始化魔方
- {
- m->up.s[1][1]=(Colors)2;m->up.s[1][2]=(Colors)4;m->up.s[1][3]=(Colors)4;
- m->up.s[2][1]=(Colors)3;m->up.s[2][2]=(Colors)5;m->up.s[2][3]=(Colors)6;
- m->up.s[3][1]=(Colors)2;m->up.s[3][2]=(Colors)1;m->up.s[3][3]=(Colors)5;
- m->down.s[1][1]=(Colors)3;m->down.s[1][2]=(Colors)3;m->down.s[1][3]=(Colors)6;
- m->down.s[2][1]=(Colors)5;m->down.s[2][2]=(Colors)3;m->down.s[2][3]=(Colors)1;
- m->down.s[3][1]=(Colors)4;m->down.s[3][2]=(Colors)6;m->down.s[3][3]=(Colors)6;
- m->front.s[1][1]=(Colors)5;m->front.s[1][2]=(Colors)5;m->front.s[1][3]=(Colors)1;
- m->front.s[2][1]=(Colors)2;m->front.s[2][2]=(Colors)4;m->front.s[2][3]=(Colors)6;
- m->front.s[3][1]=(Colors)2;m->front.s[3][2]=(Colors)2;m->front.s[3][3]=(Colors)3;
- m->back.s[1][1]=(Colors)5;m->back.s[1][2]=(Colors)2;m->back.s[1][3]=(Colors)3;
- m->back.s[2][1]=(Colors)6;m->back.s[2][2]=(Colors)1;m->back.s[2][3]=(Colors)4;
- m->back.s[3][1]=(Colors)3;m->back.s[3][2]=(Colors)3;m->back.s[3][3]=(Colors)6;
- m->left.s[1][1]=(Colors)1;m->left.s[1][2]=(Colors)4;m->left.s[1][3]=(Colors)1;
- m->left.s[2][1]=(Colors)5;m->left.s[2][2]=(Colors)6;m->left.s[2][3]=(Colors)1;
- m->left.s[3][1]=(Colors)5;m->left.s[3][2]=(Colors)2;m->left.s[3][3]=(Colors)4;
- m->right.s[1][1]=(Colors)6;m->right.s[1][2]=(Colors)5;m->right.s[1][3]=(Colors)2;
- m->right.s[2][1]=(Colors)1;m->right.s[2][2]=(Colors)2;m->right.s[2][3]=(Colors)4;
- m->right.s[3][1]=(Colors)1;m->right.s[3][2]=(Colors)3;m->right.s[3][3]=(Colors)4;
- }
- void Exit()
- {
- SNode *p,*q;
- for(p=CD.head;p;p=q)
- {
- q=p->next;
- free(p->chbuf);free(p);//釋放所有內存空間
- }
- printf("按任意鍵繼續....");
- getchar();
- }
- int main(int argc, char *argv[])
- {
- Cube magiccube;
- int i=0;
- CD.num=0;
- CD.head=NULL;
- Input(&magiccube);//輸入魔方初始狀態
- //InitializationMagiccube(&magiccube);//初始化魔方 調試用
- printf("\n獲取到的魔方狀態為:");
- PrintMagicCube(magiccube);//輸出初始化后的魔方
- DownCross(&magiccube);//底部十字
- DownCornerRestore(&magiccube);//底角還原
- CentreEdgeRestore(&magiccube);//中棱還原
- UpCross(&magiccube);//頂面十字
- UpSurfaceCornerRestore(&magiccube);//頂角面位
- UpCornerRestore(&magiccube);//頂角還原
- UpEdgeRestore(&magiccube);//頂棱還原
- printf("\n還原轉換后的魔方狀態為:");
- PrintMagicCube(magiccube);//輸出變換后的魔方
- PrintBuf();//輸出變更序列
- Exit();
- system("PAUSE");
- return 0;
- }
復制代碼
|