用C++实现魔方并输出步骤

用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");
}

运行的图像

初始化魔方
选择随机操作后
随机操作后的魔方
实现上面十字架
实现上面十字架
实现上面后
实现上面后
实现第一层的边角
实现第一层的边角
实现第一层
实现第一层
实现第二层
实现第二层
实现底面十字架
实现底面十字架
实现底面
实现底面
实现第三层边角
实现第三层边角
实现魔方
在这里插入图片描述

文章中的代码未优化,所以有些多。如果有错误,欢迎指出。

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值