- class mofang
- {
- //魔方类对魔方操作进行封装
- //数据
- Sequence CD;//解魔方操作序列
- void clockwise(Surface *sur,int i);//将sur面顺时针旋转i次
- void F(Cube *m,int i);//将魔方的正面顺时针转i次
- void B(Cube *m,int i);//将魔方的背面顺时针转i次
- void R(Cube *m,int i);//将魔方的右面顺时针转i次
- void L(Cube *m,int i);//将魔方的左面顺时针转i次
- void U(Cube *m,int i);//将魔方的上面顺时针转i次
- void D(Cube *m,int i);//将魔方的底面顺时针转i次
- void MR(Cube *m,int i);//将魔方的左面和右面之间的面以右面为基准顺时针旋转1次
- void MF(Cube *m,int i);//将魔方的前面和后面之间的面以前面为基准顺时针旋转i次
- void MU(Cube *m,int i);//将魔方的上面和底面之间的面以上面为基准顺时针旋转i次
- void cz_gs();//格式化操作CD列表到cz数组 操作列表对应格式如:F=1 B=2 R=3 L=4 U=5 D=6 11表示F执行1次 13表示F执行3次
- //////////////////////////////
- public :
- Cube mf;//魔方实体
- int cz[200];//格式化后的操作列表
- void cz_zx(int cz);//执行一个格式化的操作
- void cz_zx_f(int cz);//执行一个格式化的操作反操作
- mofang();//构造函数
- void SaveChBuf(char *sur,int i);//将cb序列存入chbuf中
- void MoveCube(Cube *m,char *sur,int i);//根据序列cb转换魔方m并将操作保存进操作序列中
- void DownCross(Cube *magiccube);//将底面拼出一个十字
- void DownCornerRestore(Cube *magiccube);//底角还原
- void CentreEdgeRestore(Cube *magiccube);//中棱归位
- void UpCross(Cube *magiccube);//顶面十字
- void UpSurfaceCornerRestore(Cube *magiccube);//顶角面位
- void UpCornerRestore(Cube *magiccube);//顶角还原
- void UpEdgeRestore(Cube *magiccube);//顶棱还原
- void InitializationMagiccube(Cube *m);//初始化魔方
- void Input(Cube magiccube);//从外部获取并实例化新魔方
- void out(Cube &magiccube);//向外部输出当前魔方状态
- void out_print(char *HC);//向外部输出格式化后的操作列表
- void jieMF();//解魔方操作步骤保存在操作列表中
- void Exit();//释放内存
- void D_F(int i){F(&mf,i);}//魔方F方向操作
- void D_B(int i){B(&mf,i);}//魔方B方向操作
- void D_R(int i){R(&mf,i);}//魔方R方向操作
- void D_L(int i){L(&mf,i);}//魔方L方向操作
- void D_U(int i){U(&mf,i);}//魔方U方向操作
- void D_D(int i){D(&mf,i);}//魔方D方向操作
- };
- mofang::mofang()
- {
- //构造函数
- CD.num=0;
- CD.head=NULL;
- //InitializationMagiccube(&mf);//初始化魔方
- }
- void mofang::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 mofang::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 mofang::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 mofang::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 mofang::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 mofang::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 mofang::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 mofang::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 mofang::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 mofang::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 mofang::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 mofang::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 mofang::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 mofang::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 mofang::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 mofang::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 mofang::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 mofang::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 mofang::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 mofang::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 mofang::Exit()
- {
- //释放所有内存空间
- SNode *p,*q;
- for(p=CD.head;p;p=q)
- {
- q=p->next;
- free(p->chbuf);free(p);//释放所有内存空间
- }
- CD.num=0;
- CD.head=NULL;
- }
- void mofang::Input(Cube magiccube)
- {
- //从外部获取并实例化新魔方
- mf=magiccube;
- }
- void mofang::out(Cube &magiccube)
- {
- //向外部输出当前魔方状态
- magiccube=mf;
- }
- void mofang::jieMF()
- {
- //解当前状态魔方并输出步骤
- DownCross(&mf);//底部十字
- DownCornerRestore(&mf);//底角还原
- CentreEdgeRestore(&mf);//中棱还原
- UpCross(&mf);//顶面十字
- UpSurfaceCornerRestore(&mf);//顶角面位
- UpCornerRestore(&mf);//顶角还原
- UpEdgeRestore(&mf);//顶棱还原
- }
- void mofang::out_print(char *HC)
- {
- //向外部输出格式化后的操作列表
- SNode *p;
- int i;
- int d=0;
- for(p=CD.head,i=1;p;p=p->next,i++)
- {
- sprintf(HC+d,"%s%d\t",p->chbuf,p->times);
- d+=3;
- if(i==5)
- {
- sprintf(HC+d,"\r\n");
- d+=2;
- sprintf(HC+d,"------------------------------------\r\n");
- d+=38;
- i=0;
- }
- }
- sprintf(HC+d,"\r\n\n本次魔方还原一共需要%d步!\n",CD.num);
- cz_gs();//格式化操作CD到cz数组里
- Exit();//清空CD链表
- InitializationMagiccube(&mf);//初始化魔方
- }
- void mofang::cz_gs()
- {
- //格式化操作CD到cz数组操作列表对应格式如:F=1 B=2 R=3 L=4 U=5 D=6 11表示F执行1次 13表示F执行3次
- SNode *p;
- int i;
- for(p=CD.head,i=0;p;p=p->next,i++)
- {
- if(!strcmp(p->chbuf,"f"))
- {
- cz[i]=10+p->times;
- }
- if(!strcmp(p->chbuf,"b"))
- {
- cz[i]=20+p->times;
- }
- if(!strcmp(p->chbuf,"r"))
- {
- cz[i]=30+p->times;
- }
- if(!strcmp(p->chbuf,"l"))
- {
- cz[i]=40+p->times;
- }
- if(!strcmp(p->chbuf,"u"))
- {
- cz[i]=50+p->times;
- }
- if(!strcmp(p->chbuf,"d"))
- {
- cz[i]=60+p->times;
- }
- }
- }
- void mofang::cz_zx(int cz)
- {
- //翻译执行一个操作步骤
- if(cz>=10&&cz<=14)
- {
- D_F(cz%10);//魔方F方向操作
- }
- if(cz>=20&&cz<=24)
- {
- D_B(cz%20);//魔方B方向操作
- }
- if(cz>=30&&cz<=34)
- {
- D_R(cz%30);//魔方R方向操作
- }
- if(cz>=40&&cz<=44)
- {
- D_L(cz%40);//魔方L方向操作
- }
- if(cz>=50&&cz<=54)
- {
- D_U(cz%50);//魔方U方向操作
- }
- if(cz>=60&&cz<=64)
- {
- D_D(cz%60);//魔方D方向操作
- }
- }
- void mofang::cz_zx_f(int cz)
- {
- //翻译执行一个操作步骤的反操作
- if(cz>=10&&cz<=14)
- {
- D_F(4-(cz%10));//魔方F方向操作
- }
- if(cz>=20&&cz<=24)
- {
- D_B(4-(cz%20));//魔方B方向操作
- }
- if(cz>=30&&cz<=34)
- {
- D_R(4-(cz%30));//魔方R方向操作
- }
- if(cz>=40&&cz<=44)
- {
- D_L(4-(cz%40));//魔方L方向操作
- }
- if(cz>=50&&cz<=54)
- {
- D_U(4-(cz%50));//魔方U方向操作
- }
- if(cz>=60&&cz<=64)
- {
- D_D(4-(cz%60));//魔方D方向操作
- }
- }
复制代码
|