用C++实现魔方并输出步骤
关于魔方的实现,首先得建立一个魔方的结构体,魔方有六个面,每个面有9块,所以我们可以用二维数组[6][9]实现。由于我不会用c++制作3D框图,所以我在输出魔方时用正方形的平面图输出。如下:
如下图储存每个方块的图片
输出步骤用链表来储存和读取
魔方的转动有18或9种形式包括:1右上ru(右面顺时针旋转90°) 2右下rd(右面逆时针旋转90°)
3左上lu(左面逆时针旋转90°) 4左下ld(左面顺时针旋转90°) 5前中上hmu(前面的中间一竖向上旋转90°) 6前中下hmd(前面的中间一竖向下旋转90°) 7:前上hu(前面顺时针旋转90°) 8前下hd(前面逆时针旋转90°) 9左中左lml(左面的中间一竖向下旋转90°) 10左中右lmr(左面的中间一竖向上旋转90°) 11后上bu(后面逆时针旋转90°) 12后下bd(后面顺时针旋转90°) 13上右ur(上面逆时针旋转90°) 14上左ul(上面逆时针旋转90°) 15前中左hml(前面的第二层向左旋转90°) 16前中右hmr(前面的第二层向右旋转90°) 17下左dl(下面逆时针旋转90°) 18下右dr(下面顺时针旋转90°)
头文件代码
#pragma once
#include<iostream>
#include<Windows.h>
#include<ctime>
using namespace std;
//魔方结构
typedef struct
{
char color;
}A;
typedef struct
{
A mf[6][9];
}mofang;
//队列结构
typedef struct node
{
int n;
struct node *next;
}Node;
typedef struct
{
Node *front;
Node *rear;
}LNode;
//进队列
void Create(LNode *&L, int i);
//出队列
bool deQueue(LNode *&L, int &i);
//销毁队列
void destroy(LNode *&L);
//创建魔方
void Createmofang(mofang *&M);
//判断输入的魔方是否正确
bool pd(mofang *M);
//判断魔方的面
void judgeface(int n);
//输出魔方
void pushmf(mofang *M);
//输出颜色
void shuchu(char c);
void puduan(int n, char &ch);
//右上1
void ru(mofang *&M);
void ru1(mofang *&M, int i, int j);
void ru2(mofang *&M, int i);
//左上3
void lu(mofang *&M);
void lu1(mofang *&M, int i, int j);
void lu2(mofang *&M, int i);
//前中上5
void hmu(mofang *&M);
void hmu1(mofang *&M,int i,int j);
//左下4
void ld(mofang *&M);
void ld1(mofang *&M, int i, int j);
//右下2
void rd(mofang *&M);
//前中下6
void hmd(mofang *&M);
//前顺7
void hu(mofang *&M);
void hu1(mofang *&M, int i, int j, int k);
void hu2(mofang *&M, int i, int j);
//前逆8
void hd(mofang *&M);
//左中右9
void lmr(mofang *&M);
void lmr1(mofang *&M, int i, int j);
void lmr2(mofang *&M, int i, int j);
//左中左10
void lml(mofang *&M);
//后上11
void bu(mofang *&M);
void bu2(mofang *&M, int i, int j);
//后下12
void bd(mofang *&M);
//上左13
void ul(mofang *&M);
//上右14
void ur(mofang *&M);
//前中左15
void hml(mofang *&M);
//前中右16
void hmr(mofang *&M);
//下左17
void dl(mofang *&M);
//下右18
void dr(mofang *&M);
//实现魔方
void shixian(mofang *&M, LNode *&L);
//第一面
void firstface(mofang *&M,LNode *&L);
void f1(mofang *&M, char F, LNode *&L);
void f2(mofang *&M, char F, LNode *&L);
//第一层
void firstlayer(mofang *&M, LNode *&L);
void fl1(mofang *&M, LNode *&L);
void fl2(mofang *&M, LNode *&L);
//第二层
void secondlayer(mofang *&M, LNode *&L);
bool sl1(mofang *&M, LNode *&L);
bool sl2(mofang *&M, LNode *&L);
void sl3(mofang *&M, LNode *&L);
void sl4(mofang *&M, LNode *&L);
void sl5(mofang *&M, LNode *&L);
//底面十字架
void shizi(mofang *&M, LNode *&L);
void shizi1(mofang *&M, LNode *&L);
//底面
void dimian(mofang *&M, LNode *&L);
bool DM1(mofang *&M, LNode *&L);
bool DM2(mofang *&M, LNode *&L);
bool DM3(mofang *&M, LNode *&L);
bool DM4(mofang *&M, LNode *&L);
void DM5(mofang *&M, LNode *&L);
void DM6(mofang *&M, LNode *&L);
void DM7(mofang *&M, LNode *&L);
void DM8(mofang *&M, LNode *&L);
void set1(mofang *&M, LNode *&L);
//第三层
void thirdlayer(mofang *&M, LNode *&L);
void tset1(mofang *&M, LNode *&L);
void tset2(mofang *&M, LNode *&L);
void tl1(mofang *&M, LNode *&L);
void tl2(mofang *&M, LNode *&L);
//输出步骤
void scb(LNode *&L);
//操作魔方
void Operation(mofang *&M,LNode *&L);
头文件实现代码
#include"mofang.h"
//创建魔方
void Createmofang(mofang *&M)
{
M = new mofang; char m; int a;
cout << "选择是否自己输入颜色,1是:";
cin >> a;
if (a == 1)
{
cout << "输入魔方颜色,蓝色:B,橙色:O,绿色:G,红色:R,白色:W,黄色:Y" << endl;
for (int i = 0; i < 6; i++)
{
judgeface(i);
for (int j = 0; j < 9; j++)
{
cin >> M->mf[i][j].color;
}cout << endl;
}
}
else
{
for (int i = 0; i < 6; i++)
{
puduan(i, m);
for (int j = 0; j < 9; j++)
{
M->mf[i][j].color = m;
}
}
}
pd(M);
}
//判断输入的魔方是否正确
bool pd(mofang *M)
{
int Y = 0, B = 0, W = 0, G = 0, O = 0, R = 0;
for (int i = 0; i < 6; i++)
for (int j = 0; j < 9; j++)
{
if (M->mf[i][j].color == 'Y')Y++;
if (M->mf[i][j].color == 'B')B++;
if (M->mf[i][j].color == 'W')W++;
if (M->mf[i][j].color == 'G')G++;
if (M->mf[i][j].color == 'O')O++;
if (M->mf[i][j].color == 'R')R++;
}
if (Y == 9 && B == 9 && W == 9 && G == 9 && O == 9 && R == 9)
cout << "输入的魔方正确!魔方如下图:" << endl;
else
{
cout << "输入的魔方不正确!魔方如下图:" << endl;
pushmf(M);
exit(0);
}
pushmf(M);
}
//判断魔方的面
void judgeface(int n)
{
cout << "请输入";
switch (n)
{
case 0:cout << "后"; break;
case 1:cout << "左"; break;
case 2:cout << "上"; break;
case 3:cout << "右"; break;
case 4:cout << "前"; break;
case 5:cout << "下"; break;
}
cout << "面的颜色:" << endl;
}
void puduan(int n,char &ch)
{
switch (n)
{
case 0:ch = 'G'; break;
case 1:ch = 'R'; break;
case 2:ch = 'W'; break;
case 3:ch = 'O'; break;
case 4:ch = 'B'; break;
case 5:ch = 'Y'; break;
}
}
//输出魔方
void pushmf(mofang *M)
{
for (int i = 0; i < 6; i++)
{
if (i == 0)
for (int j = 0; j < 9; j++)
{
if (j % 3 == 0)cout << " ";
shuchu(M->mf[i][j].color);
if ((j + 1) % 3 == 0)cout << endl;
}
if (i == 1)
{
for (int n = 0; n < 3; n++)
{
for (int j = 0; j < 3; j++)
{
shuchu(M->mf[1][j + 3 * n].color);
}
for (int j = 0; j < 3; j++)
{
shuchu(M->mf[2][j + 3 * n].color);
}
for (int j = 0; j < 3; j++)
{
shuchu(M->mf[3][j + 3 * n].color);
}cout << endl;
}
}
if (i == 4)
{
for (int j = 0; j < 9; j++)
{
if (j % 3 == 0)cout << " ";
shuchu(M->mf[i][j].color);
if ((j + 1) % 3 == 0)cout << endl;
}
}
if (i == 5)
{
for (int j = 0; j < 9; j++)
{
if (j % 3 == 0)cout << " ";
shuchu(M->mf[i][j].color);
if ((j + 1) % 3 == 0)cout << endl;
}
}
}
cout << endl;
}
//输出颜色■
void shuchu(char c)
{
switch (c)
{
case 'W':
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |
FOREGROUND_GREEN | FOREGROUND_BLUE);//设置三色相加
cout << "■"; break;
}
case 'R':
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED );
//设置红色
cout << "■";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |
FOREGROUND_GREEN | FOREGROUND_BLUE);//设置三色相加
break;
}
case 'G':
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |FOREGROUND_GREEN );
//设置绿色
cout << "■";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |
FOREGROUND_GREEN | FOREGROUND_BLUE);//设置三色相加
break;
}
case 'Y':
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED|
FOREGROUND_GREEN);
//设置黄色
cout << "■";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |
FOREGROUND_GREEN | FOREGROUND_BLUE);//设置三色相加
break;
}
case 'O':
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |
FOREGROUND_BLUE);
cout << "■";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |
FOREGROUND_GREEN | FOREGROUND_BLUE);//设置三色相加
break;
}
case 'B':
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |
FOREGROUND_BLUE);
cout << "■";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |
FOREGROUND_GREEN | FOREGROUND_BLUE);//设置三色相加
break;
}
}
}
//右上1
void ru(mofang *&M)
{
char ch3, ch6, ch9;
ch3 = M->mf[0][2].color;
ch6 = M->mf[0][5].color;
ch9 = M->mf[0][8].color;
ru1(M, 0, 2);
ru1(M, 2, 4);
ru1(M, 4, 5);
M->mf[5][2].color = ch3;
M->mf[5][5].color = ch6;
M->mf[5][8].color = ch9;
ru2(M, 3);
}
void ru1(mofang *&M, int i, int j)
{
M->mf[i][2].color = M->mf[j][2].color;
M->mf[i][5].color = M->mf[j][5].color;
M->mf[i][8].color = M->mf[j][8].color;
}
void ru2(mofang *&M, int i)
{
char m[9];
for (int j = 0; j < 9; j++)
m[j] = M->mf[i][j].color;
for (int j = 0; j < 3; j++)
{
M->mf[i][j].color = m[6 - 3 * j];
M->mf[i][j * 3 + 2].color = m[j];
M->mf[i][8 - j].color = m[j * 3 + 2];
M->mf[i][3 * j].color = m[6 + j];
}
}
//左上3
void lu(mofang *&M)
{
char c[3];
for (int i = 0; i < 3; i++)
c[i] = M->mf[0][3 * i].color;
lu1(M, 0, 2);
lu1(M, 2, 4);
lu1(M, 4, 5);
for (int i = 0; i < 3; i++)
M->mf[5][3 * i].color = c[i];
lu2(M, 1);
}
void lu1(mofang *&M, int i,int j)
{
for (int n = 0; n < 3; n++)
M->mf[i][n*3].color = M->mf[j][n*3].color;
}
void lu2(mofang *&M, int i)
{
char m[9];
for (int j = 0; j < 9; j++)
m[j] = M->mf[i][j].color;
for (int j = 0; j < 3; j++)
{
M->mf[i][j].color = m[(j + 1) * 3 - 1];
M->mf[i][(j + 1) * 3 - 1].color = m[8 - j];
M->mf[i][8 - j].color = m[6 - j * 3];
M->mf[i][6 - 3 * j].color = m[j];
}
}
//前中上5
void hmu(mofang *&M)
{
char c[3];
for (int i = 0; i < 3; i++)
c[i] = M->mf[0][i * 3 + 1].color;
hmu1(M, 0, 2);
hmu1(M, 2, 4);
hmu1(M, 4, 5);
for (int i = 0; i < 3; i++)
M->mf[5][i * 3 + 1].color = c[i];
}
void hmu1(mofang *&M, int i, int j)
{
for (int n = 0; n < 3; n++)
M->mf[i][n * 3 + 1].color = M->mf[j][n * 3 + 1].color;
}
//左下4
void ld(mofang *&M)
{
char c[3];
for (int i = 0; i < 3; i++)
c[i] = M->mf[0][3 * i].color;
ld1(M, 0, 5);
ld1(M, 5, 4);
ld1(M, 4, 2);
for (int i = 0; i < 3; i++)
M->mf[2][3 * i].color = c[i];
ru2(M, 1);
}
void ld1(mofang *&M, int i, int j)
{
for (int n = 0; n < 3; n++)
M->mf[i][n * 3].color = M->mf[j][n * 3].color;
}
//右下2
void rd(mofang *&M)
{
char ch[3];
for (int i = 0; i < 3; i++)
ch[i] = M->mf[0][(i + 1) * 3 - 1].color;
ru1(M, 0, 5);
ru1(M, 5, 4);
ru1(M, 4, 2);
for (int i = 0; i < 3; i++)
M->mf[2][(i + 1) * 3 - 1].color = ch[i];
lu2(M, 3);
}
//前中下6
void hmd(mofang *&M)
{
char c[3];
for (int i = 0; i < 3; i++)
c[i] = M->mf[0][i * 3 + 1].color;
hmu1(M, 0, 5);
hmu1(M, 5, 4);
hmu1(M, 4, 2);
for (int i = 0; i < 3; i++)
M->mf[2][i * 3 + 1].color = c[i];
}
//前上7
void hu(mofang *&M)
{
char ch[3];
for (int i = 0; i < 3; i++)
ch[i] = M->mf[1][i + 6].color;
bu2(M, 1, 5);
hu2(M, 5, 3);
hu1(M, 3, 2, 6);
for (int i = 0; i < 3; i++)
M->mf[2][i + 6].color = ch[i];
ru2(M, 4);
}
void hu1(mofang *&M, int i, int j, int k)
{
for (int n = k; n < k + 3; n++)
M->mf[i][n].color = M->mf[j][n].color;
}
void hu2(mofang *&M, int i, int j) //[0]=[8]
{
for (int n = 0; n < 3; n++)
M->mf[i][n].color = M->mf[j][8 - n].color;
}
//前下8
void hd(mofang *&M)
{
char ch[3];
for (int i = 0; i < 3; i++)
ch[i] = M->mf[3][i + 6].color;
bu2(M, 3, 5);
hu2(M, 5, 1);
hu1(M, 1, 2, 6);
for (int i = 0; i < 3; i++)
M->mf[2][i + 6].color = ch[i];
lu2(M, 4);
}
//左中右9
void lmr(mofang *&M)
{
char ch[3];
for (int i = 0; i < 3; i++)
ch[i] = M->mf[2][i + 3].color;
hu1(M, 2, 1, 3);
lmr1(M, 1, 5);
lmr2(M, 5, 3);
for (int i = 0; i < 3; i++)
M->mf[3][i + 3].color = ch[i];
}
void lmr1(mofang *&M, int i, int j)
{
for (int n = 0; n < 3; n++)
M->mf[i][n + 3].color = M->mf[j][5 - n].color; //[3]=[5];
}
void lmr2(mofang *&M, int i, int j)
{
for (int n = 0; n < 3; n++)
M->mf[i][5 - n].color = M->mf[j][n + 3].color; //[5]=[3];
}
//左中左10
void lml(mofang *&M)
{
char ch[3];
for (int i = 0; i < 3; i++)
ch[i] = M->mf[2][i + 3].color;
hu1(M, 2, 3, 3);
lmr1(M, 3, 5);
lmr2(M, 5, 1);
for (int i = 0; i < 3; i++)
M->mf[1][i + 3].color = ch[i];
}
//后上11
void bu(mofang *&M)
{
char ch[3];
for (int i = 0; i < 3; i++)
ch[i] = M->mf[2][i].color;
hu1(M, 2, 1, 0);
hu2(M, 1, 5);
bu2(M, 5, 3);
for (int i = 0; i < 3; i++)
M->mf[3][i].color = ch[i];
lu2(M, 0);
}
void bu2(mofang *&M, int i, int j) //[8]=[0]
{
for (int n = 0; n < 3; n++)
M->mf[i][8-n].color = M->mf[j][n].color;
}
//后下12
void bd(mofang *&M)
{
char ch[3];
for (int i = 0; i < 3; i++)
ch[i] = M->mf[2][i].color;
hu1(M, 2, 3, 0);
hu2(M, 3, 5);
bu2(M, 5, 1);
for (int i = 0; i < 3; i++)
M->mf[1][i].color = ch[i];
ru2(M, 0);
}
//上左13
void ul(mofang *&M)
{
char ch[3];
for (int i = 0; i < 3; i++)
ch[i] = M->mf[4][i].color;
for (int i = 0; i < 3; i++)
M->mf[4][i].color = M->mf[3][6 - 3 * i].color;
for (int i = 0; i < 3; i++)
M->mf[3][3 * i].color = M->mf[0][i + 6].color;
for (int i = 0; i < 3; i++)
M->mf[0][i + 6].color = M->mf[1][8 - 3 * i].color;
for (int i = 0; i < 3; i++)
M->mf[1][8 - 3 * i].color = ch[2 - i];
ru2(M, 2);
}
//上右14
void ur(mofang *&M)
{
char ch[3];
for (int i = 0; i < 3; i++)
ch[i] = M->mf[4][i].color;
for (int i = 0; i < 3; i++)
M->mf[4][i].color = M->mf[1][3 * i + 2].color;
for (int i = 0; i < 3; i++)
M->mf[1][3 * i + 2].color = M->mf[0][8 - i].color;
for (int i = 0; i < 3; i++)
M->mf[0][6 + i].color = M->mf[3][3 * i].color;
for (int i = 0; i < 3; i++)
M->mf[3][3 * i].color = ch[2 - i];
lu2(M, 2);
}
//前中左15
void hml(mofang *&M)
{
char ch[3];
for (int i = 0; i < 3; i++)
ch[i] = M->mf[4][i + 3].color;
for (int i = 0; i < 3; i++)
M->mf[4][i + 3].color = M->mf[3][7 - 3 * i].color;
for (int i = 0; i < 3; i++)
M->mf[3][3 * i + 1].color = M->mf[0][i + 3].color;
for (int i = 0; i < 3; i++)
M->mf[0][i + 3].color = M->mf[1][7 - 3 * i].color;
for (int i = 0; i < 3; i++)
M->mf[1][3 * i + 1].color = ch[i];
}
//前中右16
void hmr(mofang *&M)
{
char ch[3];
for (int i = 0; i < 3; i++)
ch[i] = M->mf[4][i + 3].color;
for (int i = 0; i < 3; i++)
M->mf[4][i + 3].color = M->mf[1][3 * i + 1].color;
for (int i = 0; i < 3; i++)
M->mf[1][3 * i + 1].color = M->mf[0][5 - i].color;
for (int i = 0; i < 3; i++)
M->mf[0][3 + i].color = M->mf[3][3 * i + 1].color;
for (int i = 0; i < 3; i++)
M->mf[3][3 * i + 1].color = ch[2 - i];
}
//下左17
void dl(mofang *&M)
{
char ch[3];
for (int i = 0; i < 3; i++)
ch[i] = M->mf[4][i + 6].color;
for (int i = 0; i < 3; i++)
M->mf[4][i + 6].color = M->mf[3][8 - 3 * i].color;
for (int i = 0; i < 3; i++)
M->mf[3][3 * i + 2].color = M->mf[0][i].color;
for (int i = 0; i < 3; i++)
M->mf[0][i].color = M->mf[1][6 - 3 * i].color;
for (int i = 0; i < 3; i++)
M->mf[1][3 * i].color = ch[i];
lu2(M, 5);
}
//下右18
void dr(mofang *&M)
{
char ch[3];
for (int i = 0; i < 3; i++)
ch[i] = M->mf[4][i + 6].color;
for (int i = 0; i < 3; i++)
M->mf[4][i + 6].color = M->mf[1][3 * i].color;
for (int i = 0; i < 3; i++)
M->mf[1][3 * i].color = M->mf[0][2 - i].color;
for (int i = 0; i < 3; i++)
M->mf[0][i].color = M->mf[3][3 * i + 2].color;
for (int i = 0; i < 3; i++)
M->mf[3][3 * i + 2].color = ch[2 - i];
ru2(M, 5);
}
//第一面
void firstface(mofang *&M, LNode *&L)
{
char F;
F = M->mf[2][4].color;
while (M->mf[2][1].color != F || M->mf[2][3].color != F || M->mf[2][5].color != F || M->mf[2][7].color != F)
{
if (M->mf[2][7].color != F)
f1(M, F, L);
else
{
ur(M);
Create(L, 14);
}
}
scb(L);
pushmf(M);
while (M->mf[2][0].color != F || M->mf[2][2].color != F || M->mf[2][6].color != F || M->mf[2][8].color != F)
{
if (M->mf[2][6].color != F)
f2(M, F, L);
else
{
ur(M);
Create(L, 14);
}
}
}
void f1(mofang *&M,char F,LNode *&L)
{
if (M->mf[4][1].color == F)
{
hu(M); Create(L, 7);
hu(M); Create(L, 7);
dr(M); Create(L, 18);
hmd(M); Create(L, 6);
dl(M); Create(L, 17);
hmu(M); Create(L, 5);
return;
}
else if (M->mf[3][3].color == F)
{
ru(M); Create(L, 1);
ru(M); Create(L, 1);
hmd(M); Create(L, 6);
dl(M); Create(L, 17);
hmu(M); Create(L, 5);
return;
}
else if (M->mf[0][7].color == F)
{
hu(M); Create(L, 7);
bu(M); Create(L, 11);
hml(M); Create(L, 15);
hd(M); Create(L, 8);
return;
}
else if (M->mf[1][5].color == F)
{
lu(M); Create(L, 3);
lu(M); Create(L, 3);
hmd(M); Create(L, 6);
dr(M); Create(L, 18);
hmu(M); Create(L, 5);
return;
}
int e = 0;
while (M->mf[0][5].color != F && M->mf[0][3].color != F && e < 4)
{
hmr(M); Create(L, 16);
e++;
}
if (M->mf[0][5].color == F)
{
hu(M); Create(L, 7);
hml(M); Create(L, 15);
hd(M); Create(L, 8);
return;
}
if (M->mf[0][3].color==F)
{
hd(M); Create(L, 8);
hmr(M); Create(L, 16);
hu(M); Create(L, 7);
return;
}
e = 0;
while (M->mf[1][3].color != F && e < 4)
{
dr(M); Create(L, 18);
e++;
}
if (M->mf[1][3].color == F)
{
hmd(M); Create(L, 6);
dr(M); Create(L, 18);
hmu(M); Create(L, 5);
return;
}
e = 0;
while (M->mf[5][1].color != F && e < 4)
{
dr(M); Create(L, 18);
e++;
}
if (M->mf[5][1].color == F)
{
hmd(M); Create(L, 6);
dr(M); Create(L, 18);
dr(M); Create(L, 18);
hmu(M); Create(L, 18);
}
}
void f2(mofang *&M, char F, LNode *&L)
{
int e = 0;
while (M->mf[4][0].color != F && M->mf[4][2].color != F && e < 4)
{
ur(M); Create(L, 14);
e++;
}
if (M->mf[4][0].color == F)
{
ld(M); Create(L, 4);
dl(M); Create(L, 17);
lu(M); Create(L, 3);
dr(M); Create(L, 18);
ld(M); Create(L, 4);
dl(M); Create(L, 17);
lu(M); Create(L, 3);
return;
}
if (M->mf[4][2].color == F)
{
rd(M); Create(L, 2);
dr(M); Create(L, 18);
ru(M); Create(L, 1);
dl(M); Create(L, 17);
dl(M); Create(L, 17);
hd(M); Create(L, 8);
dr(M); Create(L, 18);
hu(M); Create(L, 7);
return;
}
e = 0;
while (M->mf[2][6].color == F && e < 4)
{
ur(M);
Create(L, 14);
}
if (M->mf[2][6].color == F)
return;
e = 0;
while (M->mf[4][6].color != F && M->mf[4][8].color != F && e < 4)
{
dr(M); Create(L, 18);
e++;
}
if (M->mf[4][6].color == F)
{
dr(M); Create(L, 18);
ld(M); Create(L, 4);
dl(M); Create(L, 17);
lu(M); Create(L, 3);
return;
}
if (M->mf[4][8].color == F)
{
dl(M); Create(L, 17);
dl(M); Create(L, 17);
hd(M); Create(L, 8);
dr(M); Create(L, 18);
hu(M); Create(L, 7);
return;
}
e = 0;
while (M->mf[5][0].color != F && e < 4)
{
dl(M); Create(L, 17);
e++;
}
if (M->mf[5][0].color == F)
{
ld(M); Create(L, 4);
dl(M); Create(L, 17);
lu(M); Create(L, 3);
hd(M); Create(L, 8);
dr(M); Create(L, 18);
dr(M); Create(L, 18);
hu(M); Create(L, 7);
return;
}
}
//第一层
void firstlayer(mofang *&M, LNode *&L)
{
while (M->mf[4][0].color != M->mf[4][2].color||
M->mf[1][2].color != M->mf[1][8].color||
M->mf[0][6].color != M->mf[0][8].color
|| M->mf[3][0].color != M->mf[3][6].color)
{
if (M->mf[4][0].color != M->mf[4][2].color)
fl1(M, L);
else
{
ul(M); Create(L, 13);
}
}
scb(L);
pushmf(M);
while (M->mf[4][0].color != M->mf[4][1].color ||
M->mf[1][2].color != M->mf[1][5].color ||
M->mf[0][6].color != M->mf[0][7].color
|| M->mf[3][0].color != M->mf[3][3].color)
{
if (M->mf[4][0].color != M->mf[4][1].color)
fl2(M, L);
else
{
ul(M); Create(L, 13);
}
}
}
void fl1(mofang *&M, LNode *&L)
{
char F;
F = M->mf[4][0].color;
if (M->mf[3][0].color == F)
{
hu(M); Create(L, 7);
dl(M); Create(L, 17);
hd(M); Create(L, 8);
bu(M); Create(L, 11);
dr(M); Create(L, 18);
bd(M); Create(L, 12);
hu(M); Create(L, 7);
dl(M); Create(L, 17);
hd(M); Create(L, 8);
return;
}
if (M->mf[0][6].color == F)
{
bd(M); Create(L, 12);
dl(M); Create(L, 17);
bu(M); Create(L, 11);
rd(M); Create(L, 2);
dr(M); Create(L, 18);
dr(M); Create(L, 18);
ru(M); Create(L, 1);
dl(M); Create(L, 17);
lu(M); Create(L, 3);
dr(M); Create(L, 18);
ld(M); Create(L, 4);
return;
}
}
void fl2(mofang *&M, LNode *&L)
{
char F;
F = M->mf[4][0].color;
if (M->mf[3][3].color == F)
{
hmd(M); Create(L, 6);
lmr(M); Create(L, 9);
dr(M); Create(L, 18);
lml(M); Create(L, 10);
dr(M); Create(L, 18);
dr(M); Create(L, 18);
hmu(M); Create(L, 5);
return;
}
if (M->mf[0][7].color == F)
{
hmd(M); Create(L, 6);
dr(M); Create(L, 18);
hmu(M); Create(L, 5);
hmu(M); Create(L, 5);
dr(M); Create(L, 18);
hmd(M); Create(L, 6);
hmd(M); Create(L, 6);
dr(M); Create(L, 18);
hmu(M); Create(L, 5);
return;
}
if (M->mf[1][5].color == F)
{
hmd(M); Create(L, 6);
lml(M); Create(L, 10);
dl(M); Create(L, 17);
lmr(M); Create(L, 9);
dr(M); Create(L, 18);
dr(M); Create(L, 18);
hmu(M); Create(L, 5);
return;
}
}
//第二层
void secondlayer(mofang *&M, LNode *&L)
{
char f = M->mf[5][4].color;
while (sl1(M,L))
{
while (M->mf[4][7].color != f&&M->mf[5][1].color != f)
{
dr(M); Create(L, 18);
}
sl4(M, L);
}
while (sl2(M,L))
{
sl3(M, L);
}
while (M->mf[4][4].color != M->mf[4][0].color)
{
hmr(M); Create(L, 16);
}
}
bool sl1(mofang *&M, LNode *&L)
{
char F = M->mf[5][4].color; int e = 0;
while ((M->mf[4][3].color == F || M->mf[1][7].color == F) && e < 4)
{
hmr(M); Create(L, 16);
e++;
}
if (M->mf[4][3].color == F || M->mf[1][7].color == F)
return false;
else
return true;
}
bool sl2(mofang *&M, LNode *&L)
{
int i = 0;
while (M->mf[4][3].color == M->mf[4][4].color&&M->mf[4][4].color == M->mf[4][5].color&&i < 4)
{
hmr(M); Create(L, 16);
i++;
}
if (M->mf[4][3].color == M->mf[4][4].color&&M->mf[4][4].color == M->mf[4][5].color)
return false;
else
return true;
}
void sl3(mofang *&M, LNode *&L)
{
char F = M->mf[4][4].color;
char f = M->mf[1][4].color;
char s = M->mf[5][4].color;
char S = M->mf[3][4].color;
while ((M->mf[4][7].color != F && M->mf[5][1].color != F )||!(M->mf[5][1].color != s&& M->mf[4][7].color != s))
{
dr(M); Create(L, 18);
}
if (M->mf[4][7].color == F && M->mf[5][1].color != s)
{
if (M->mf[5][1].color == f)
{
sl4(M, L);
return;
}
else
{
sl5(M, L);
return;
}
}
if (M->mf[5][1].color == F && M->mf[4][7].color ==f)
{
hmr(M); Create(L, 16);
sl5(M, L);
return;
}
if (M->mf[5][1].color == F && M->mf[4][7].color == S)
{
hml (M); Create(L, 15);
sl4(M, L);
return;
}
}
void sl4(mofang *&M, LNode *&L)
{
dr(M); Create(L, 18);
ld(M); Create(L, 4);
dl(M); Create(L, 17);
lu(M); Create(L, 3);
dl(M); Create(L, 17);
hd(M); Create(L, 8);
dr(M); Create(L, 18);
hu(M); Create(L, 7);
}
void sl5(mofang *&M, LNode *&L)
{
dl(M); Create(L, 17);
rd(M); Create(L, 3);
dr(M); Create(L, 18);
ru(M); Create(L, 4);
dr(M); Create(L, 18);
hu(M); Create(L, 7);
dl(M); Create(L, 17);
hd(M); Create(L, 8);
}
//底面十字架
void shizi(mofang *&M, LNode *&L)
{
char F = M->mf[5][4].color;
while (!(M->mf[5][1].color == F && M->mf[5][3].color == F && M->mf[5][5].color == F && M->mf[5][7].color == F))
{
int e = 0;
while (!(M->mf[5][3].color == F && M->mf[5][5].color == F) && e < 4)
{
dr(M); Create(L, 18); e++;
}
if (M->mf[5][3].color == F && M->mf[5][5].color == F)
{
shizi1(M, L);
shizi1(M, L);
}
else
{
e = 0;
while (!(M->mf[5][3].color == F && M->mf[5][7].color == F) && e < 4)
{
dr(M); Create(L, 18); e++;
}
shizi1(M, L);
}
}
}
void shizi1(mofang *&M, LNode *&L)
{
hd(M); Create(L, 8);
dl(M); Create(L, 17);
rd(M); Create(L, 2);
dr(M); Create(L, 18);
ru(M); Create(L, 1);
hu(M); Create(L, 7);
}
//底面
void dimian(mofang *&M, LNode *&L)
{
char F = M->mf[5][4].color;
if (M->mf[5][0].color == F && M->mf[5][2].color == F && M->mf[5][6].color == F && M->mf[5][8].color == F)
return;
else if (DM1(M, L))
{
DM5(M, L);
return;
}
else if (DM2(M, L))
{
DM6(M, L);
return;
}
else if (DM3(M, L))
{
DM7(M, L);
return;
}
else if (DM4(M, L))
{
DM8(M, L);
return;
}
while (M->mf[5][0].color != F || M->mf[5][2].color != F || M->mf[5][6].color != F || M->mf[5][8].color != F)
{
while (DM1(M, L)&&DM2)
{
if (DM1(M, L))
{
DM5(M, L);
}
}
}
}
bool DM1(mofang *&M, LNode *&L)
{
int e = 0;
char F = M->mf[5][4].color;
while (!(M->mf[5][6].color == F && M->mf[5][0].color != F && M->mf[5][2].color != F && M->mf[5][8].color != F) && e < 4)
{
dr(M); Create(L, 18); e++;
}
if (M->mf[5][6].color == F && M->mf[5][0].color != F && M->mf[5][2].color != F && M->mf[5][8].color != F)
return true;
else
return false;
}
bool DM2(mofang *&M, LNode *&L)
{
char F = M->mf[5][4].color;
if (M->mf[5][6].color != F && M->mf[5][0].color != F && M->mf[5][2].color != F && M->mf[5][8].color != F)
{
while (!(M->mf[4][6].color == F && M->mf[4][8].color == F))
{
dr(M); Create(L, 18);
}
return true;
}
else
return false;
}
bool DM3(mofang *&M, LNode *&L)
{
char F = M->mf[5][4].color;
int e = 0;
while (!(M->mf[5][6].color != F && M->mf[5][0].color == F && M->mf[5][2].color != F && M->mf[5][8].color == F)&&e<2)
{
dr(M); Create(L, 18); e++;
}
if (M->mf[5][6].color != F && M->mf[5][0].color == F && M->mf[5][2].color != F && M->mf[5][8].color == F)
return true;
else
return false;
}
bool DM4(mofang *&M, LNode *&L)
{
char F = M->mf[5][4].color;
int e = 0;
while (!(M->mf[5][6].color != F && M->mf[5][0].color != F && M->mf[5][2].color == F && M->mf[5][8].color == F) && e < 4)
{
dr(M); Create(L, 18); e++;
}
if (M->mf[5][6].color != F && M->mf[5][0].color != F && M->mf[5][2].color == F && M->mf[5][8].color == F)
return true;
else
return false;
}
void DM5(mofang *&M, LNode *&L)
{
if (M->mf[4][6].color == M->mf[5][4].color)
set1(M, L);
else
{
set1(M, L);
set1(M, L);
}
}
void DM6(mofang *&M, LNode *&L)
{
int i = 0;
if (M->mf[0][0].color == M->mf[5][4].color)
{
dr(M); Create(L, 18); i = 1;
}
set1(M, L);
if (i)
{
dr(M); Create(L, 18);
dr(M); Create(L, 18);
}
else
dl(M); Create(L, 17);
DM5(M, L);
}
void DM7(mofang *&M, LNode *&L)
{
if (M->mf[4][8].color == M->mf[5][4].color)
{
dr(M); Create(L, 18);
dr(M); Create(L, 18);
}
set1(M, L);
dr(M); Create(L, 18);
dr(M); Create(L, 18);
DM5(M, L);
}
void DM8(mofang *&M, LNode *&L)
{
if (M->mf[4][6].color == M->mf[5][4].color)
{
set1(M, L);
dl(M); Create(L, 17);
DM5(M, L);
}
else
{
dl(M); Create(L, 17);
set1(M, L);
dr(M); Create(L, 18);
DM5(M, L);
}
}
void set1(mofang *&M, LNode *&L)
{
ru(M); Create(L, 1);
dr(M); Create(L, 18);
rd(M); Create(L, 2);
dr(M); Create(L, 18);
ru(M); Create(L, 1);
dr(M); Create(L, 18);
dr(M); Create(L, 18);
rd(M); Create(L, 2);
dr(M); Create(L, 18);
dr(M); Create(L, 18);
}
//第三层
void thirdlayer(mofang *&M, LNode *&L)
{
int e;
e = 0;
while (M->mf[4][6].color == M->mf[4][8].color&&e < 4)
{
dr(M); Create(L, 18); e++;
}
if (M->mf[4][6].color != M->mf[4][8].color)
tl1(M, L);
scb(L);
pushmf(M);
B:
e = 0;
while (M->mf[4][6].color == M->mf[4][7].color&&e < 4)
{
dr(M); Create(L, 18); e++;
}
if (M->mf[4][6].color != M->mf[4][7].color)
{
tl2(M, L); goto B;
}
while (M->mf[4][4].color != M->mf[4][7].color)
{
dr(M); Create(L, 18);
}
}
void tset1(mofang *&M, LNode *&L)
{
ld(M); Create(L, 4);
bu(M); Create(L, 11);
ld(M); Create(L, 4);
hd(M); Create(L, 8);
hd(M); Create(L, 8);
lu(M); Create(L, 3);
bd(M); Create(L, 12);
ld(M); Create(L, 4);
hd(M); Create(L, 8);
hd(M); Create(L, 8);
lu(M); Create(L, 3);
lu(M); Create(L, 3);
}
void tset2(mofang *&M, LNode *&L)
{
ld(M); Create(L, 4);
dl(M); Create(L, 17);
ld(M); Create(L, 4);
dr(M); Create(L, 18);
ld(M); Create(L, 4);
dr(M); Create(L, 18);
ld(M); Create(L, 4);
dl(M); Create(L, 18);
lu(M); Create(L, 3);
dl(M); Create(L, 17);
lu(M); Create(L, 3);
lu(M); Create(L, 3);
}
void tl1(mofang *&M, LNode *&L)
{
int e;
A:
e = 0;
while (M->mf[4][6].color != M->mf[4][8].color&&e < 4)
{
dr(M); Create(L, 18); e++;
}
if (M->mf[4][6].color == M->mf[4][8].color)
tset1(M, L);
else
{
tset1(M, L);
goto A;
}
}
void tl2(mofang *&M, LNode *&L)
{
int e;
A:
e = 0;
while (M->mf[4][6].color != M->mf[4][7].color&&e < 4)
{
dr(M); Create(L, 18); e++;
}
if (M->mf[4][6].color == M->mf[4][7].color)
{
dr(M); Create(L, 18);
dr(M); Create(L, 18);
tset2(M, L);
return;
}
else
{
tset2(M, L);
goto A;
}
}
//实现魔方
void shixian(mofang *&M,LNode *&L)
{
firstface(M, L);
scb(L);
pushmf(M);
firstlayer(M, L);
scb(L);
pushmf(M);
secondlayer(M, L);
scb(L);
pushmf(M);
shizi(M, L);
scb(L);
pushmf(M);
dimian(M, L);
scb(L);
pushmf(M);
thirdlayer(M, L);
scb(L);
destroy(L);
}
//进队列
void Create(LNode *&L,int i)
{
Node *p;
p = new Node;
p->n = i;
p->next = NULL;
if (L->front==NULL)
L->front = L->rear = p;
else
{
L->rear->next = p;
L->rear = p;
}
}
//出队列
bool deQueue(LNode *&L, int &i)
{
Node *p;
if (L->front == NULL)
return false;
p = L->front;
if (L->front == L->rear)
L->front = L->rear = NULL;
else
L->front = L->front->next;
i = p->n;
delete p;
return true;
}
void destroy(LNode *&L)
{
Node *pre = L->front, *p;
if (pre != NULL)
{
p = pre->next;
while (pre->next!= NULL)
{
free(pre);
pre = p;
p = pre->next;
}
free(pre);
}
free(L);
}
//输出步骤
void scb(LNode *&L)
{
int e;int n=0;
while (L->front != NULL)
{
n++;
deQueue(L, e);
switch (e)
{
case 1:cout << "右上->"; break;
case 2:cout << "右下->"; break;
case 3:cout << "左上->"; break;
case 4:cout << "左下->"; break;
case 5:cout << "前中上->"; break;
case 6:cout << "前中下->"; break;
case 7:cout << "前上->"; break;
case 8:cout << "前下->"; break;
case 9:cout << "左中右->"; break;
case 10:cout << "左中左->"; break;
case 11:cout << "后上->"; break;
case 12:cout << "后下->"; break;
case 13:cout << "上左->"; break;
case 14:cout << "上右->"; break;
case 15:cout << "前中左->"; break;
case 16:cout << "前中右->"; break;
case 17:cout << "下左->"; break;
case 18:cout << "下右->"; break;
}
if (n % 6 == 0)
cout << endl;
}
cout << endl;
}
//操作魔方
void Operation(mofang *&M,LNode *&L)
{
srand(int(time(0)));
int x = -1; int e = 0; int a = 0;
cout << "**********************************************************" << endl;
cout << "*1:右上\t\t2:右下\t\t3:左上\t\t4:左下 *" << endl;
cout << "*5:前中上\t6:前中下\t7:前上\t\t8:前下 *" << endl;
cout << "*9:左中左\t10:左中右\t11:后上\t\t12:后下 *" << endl;
cout << "*13:上左\t14:上右\t\t15:前中左\t16:前中右*" << endl;
cout << "*17:下左\t18:下右\t\t***" << endl;
cout << "**********************************************************" << endl;
cout << "输入0随机操作十次,1手动输入:";
cin >> e;
A:
if (e)
{
cout << "输入0退出操作!!! x= ";
cin >> x; a = 1;
}
else
{
x = rand() % 18 + 1;
a++;
Create(L, x);
}
switch (x)
{
case 0:break;
case 1:ru(M); break;
case 2:rd(M); break;
case 3:lu(M); break;
case 4:ld(M); break;
case 5:hmu(M); break;
case 6:hmd(M); break;
case 7:hu(M); break;
case 8:hd(M); break;
case 9:lmr(M); break;
case 10:lml(M); break;
case 11:bu(M); break;
case 12:bd(M); break;
case 13:ul(M); break;
case 14:ur(M); break;
case 15:hml(M); break;
case 16:hmr(M); break;
case 17:dl(M); break;
case 18:dr(M); break;
}
if (a % 10 == 0)
{
scb(L);
pushmf(M);
cout << "输入0随机操作十次,1手动输入,2退出操作:";
cin >> e;
if (e >= 2)return;
goto A;
}
if (x > 0)
{
goto A;
}
}
main函数
#include"mofang.h"
int main()
{
mofang *M;
LNode *L;
L = new LNode;
L->front = L->rear = NULL;
Createmofang(M);
Operation(M, L);
pushmf(M);
shixian(M, L);
pushmf(M);
delete M;
system("pause");
}
运行的图像
选择随机操作后
实现上面十字架
实现上面后
实现第一层的边角
实现第一层
实现第二层
实现底面十字架
实现底面
实现第三层边角
实现魔方
文章中的代码未优化,所以有些多。如果有错误,欢迎指出。