久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
對以前C版的魔方操作進行封裝和擴展
[打印本頁]
作者:
51黑黑
時間:
2016-1-6 02:30
標題:
對以前C版的魔方操作進行封裝和擴展
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方向操作
}
}
復制代碼
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲第一区国产精品
|
国产一区二区三区
|
国内精品视频在线
|
亚洲国产aⅴ精品
|
亚洲一区导航
|
日韩精品网站
|
国产在线精品一区二区
|
a级在线免费视频
|
午夜视频免费在线观看
|
涩色视频在线观看
|
992人人草
|
亚洲国产精品一区二区三区
|
成年免费在线观看
|
亚洲综合在
|
久久国产区
|
久久国产精品一区
|
91国内在线观看
|
在线中文字幕亚洲
|
91视频大全
|
欧美一级片
|
免费中文字幕日韩欧美
|
国产欧美在线播放
|
日本啊v在线
|
国产在线精品一区二区三区
|
女同久久另类99精品国产
|
精品国产一区二区在线
|
久久网站免费视频
|
国产日韩中文字幕
|
国产精品视频一区二区三区四区国
|
精品无码三级在线观看视频
|
色偷偷噜噜噜亚洲男人
|
一本色道精品久久一区二区三区
|
亚洲精品免费视频
|
亚洲成人黄色
|
av在线二区
|
欧美一级黄色免费看
|
伊人天堂网
|
91在线观看
|
男人的天堂中文字幕
|
天天草av
|
精品久久精品
|