//魔方程序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
//数据结构:
typedef enum colors
{blue=1,red,yellow,green,white,orange}Colors;//6种颜色
typedef struct surface
{
Colors s[4][4];
}Surface;//每个面有3*3个小格,从下标1开始表示,每一面的颜色是固定的
typedef struct cube
{
Surface up,down,front,back,left,right;
}Cube;//魔方的6个面
typedef struct snode
{
char *chbuf;
int times;
struct snode *next;
}SNode;
typedef struct sequence
{
SNode *head;//存储魔方转换序列
int num;//魔方转换的次数
}Sequence;
Sequence CD;
//程序:
void SaveChBuf(char *sur,int i)//将cb序列存入chbuf中
{
char *str;
int len=strlen(sur);
SNode *p,*q;
if(i%4)
{
str=(char *)malloc(sizeof(char)*(len+2));
if(!str)
{
printf("内存不足!\n");
exit(0);
}
strcpy(str,sur);
q=(SNode *)malloc(sizeof(SNode));
if(!q)
{
printf("内存不足!\n");
exit(0);
}
q->chbuf=str;
q->times=i;
q->next=NULL;
if(CD.head==NULL)
{
CD.head=q;
CD.num++;
}
else
{
for(p=CD.head;p->next;p=p->next);
if(!strcmp(p->chbuf,q->chbuf))
{
p->times=(p->times+q->times)%4;
free(q->chbuf);free(q);
if(!(p->times))
{
if(p==CD.head)
{
CD.head=NULL;
free(p->chbuf);free(p);
CD.num--;
}
else
{
for(q=CD.head;q->next!=p;q=q->next);
q->next=NULL;
free(p->chbuf);free(p);
CD.num--;
}
}
}
else
{
p->next=q;
CD.num++;
}
}
}
}
void clockwise(Surface *sur,int i)//将sur面顺时针旋转i次
{
Surface t;
for(;i>0;i--)
{
t=*sur;
sur->s[1][1]=t.s[3][1];
sur->s[1][2]=t.s[2][1];
sur->s[1][3]=t.s[1][1];
sur->s[2][1]=t.s[3][2];
sur->s[2][2]=t.s[2][2];
sur->s[2][3]=t.s[1][2];
sur->s[3][1]=t.s[3][3];
sur->s[3][2]=t.s[2][3];
sur->s[3][3]=t.s[1][3];
}
}
void F(Cube *m,int i)//将魔方的正面顺时针转i次
{
Cube n;
for(;i>0;i--)
{
n=*m;
clockwise(&m->front,1);
m->right.s[1][1]=n.up.s[3][1];
m->right.s[2][1]=n.up.s[3][2];
m->right.s[3][1]=n.up.s[3][3];
m->down.s[1][1]=n.right.s[3][1];
m->down.s[1][2]=n.right.s[2][1];
m->down.s[1][3]=n.right.s[1][1];
m->left.s[1][3]=n.down.s[1][1];
m->left.s[2][3]=n.down.s[1][2];
m->left.s[3][3]=n.down.s[1][3];
m->up.s[3][1]=n.left.s[3][3];
m->up.s[3][2]=n.left.s[2][3];
m->up.s[3][3]=n.left.s[1][3];
}
}
void B(Cube *m,int i)//将魔方的背面顺时针转i次
{
Cube n;
for(;i>0;i--)
{
n=*m;
clockwise(&m->back,1);
m->right.s[1][3]=n.down.s[3][3];
m->right.s[2][3]=n.down.s[3][2];
m->right.s[3][3]=n.down.s[3][1];
m->down.s[3][1]=n.left.s[1][1];
m->down.s[3][2]=n.left.s[2][1];
m->down.s[3][3]=n.left.s[3][1];
m->left.s[1][1]=n.up.s[1][3];
m->left.s[2][1]=n.up.s[1][2];
m->left.s[3][1]=n.up.s[1][1];
m->up.s[1][1]=n.right.s[1][3];
m->up.s[1][2]=n.right.s[2][3];
m->up.s[1][3]=n.right.s[3][3];
}
}
void R(Cube *m,int i)//将魔方的右面顺时针转i次
{
Cube n;
for(;i>0;i--)
{
n=*m;
clockwise(&m->right,1);
m->up.s[1][3]=n.front.s[1][3];
m->up.s[2][3]=n.front.s[2][3];
m->up.s[3][3]=n.front.s[3][3];
m->front.s[1][3]=n.down.s[1][3];
m->front.s[2][3]=n.down.s[2][3];
m->front.s[3][3]=n.down.s[3][3];
m->down.s[1][3]=n.back.s[3][1];
m->down.s[2][3]=n.back.s[2][1];
m->down.s[3][3]=n.back.s[1][1];
m->back.s[3][1]=n.up.s[1][3];
m->back.s[2][1]=n.up.s[2][3];
m->back.s[1][1]=n.up.s[3][3];
}
}
void L(Cube *m,int i)//将魔方的左面顺时针转i次
{
Cube n;
for(;i>0;i--)
{
n=*m;
clockwise(&m->left,1);
m->up.s[1][1]=n.back.s[3][3];
m->up.s[2][1]=n.back.s[2][3];
m->up.s[3][1]=n.back.s[1][3];
m->back.s[1][3]=n.down.s[3][1];
m->back.s[2][3]=n.down.s[2][1];
m->back.s[3][3]=n.down.s[1][1];
m->down.s[1][1]=n.front.s[1][1];
m->down.s[2][1]=n.front.s[2][1];
m->down.s[3][1]=n.front.s[3][1];
m->front.s[1][1]=n.up.s[1][1];
m->front.s[2][1]=n.up.s[2][1];
m->front.s[3][1]=n.up.s[3][1];
}
}
void U(Cube *m,int i)//将魔方的上面顺时针转i次
{
Cube n;
for(;i>0;i--)
{
n=*m;
clockwise(&m->up,1);
m->front.s[1][1]=n.right.s[1][1];
m->front.s[1][2]=n.right.s[1][2];
m->front.s[1][3]=n.right.s[1][3];
m->right.s[1][1]=n.back.s[1][1];
m->right.s[1][2]=n.back.s[1][2];
m->right.s[1][3]=n.back.s[1][3];
m->back.s[1][1]=n.left.s[1][1];
m->back.s[1][2]=n.left.s[1][2];
m->back.s[1][3]=n.left.s[1][3];
m->left.s[1][1]=n.front.s[1][1];
m->left.s[1][2]=n.front.s[1][2];
m->left.s[1][3]=n.front.s[1][3];
}
}
void D(Cube *m,int i)//将魔方的底面顺时针转i次
{
Cube n;
for(;i>0;i--)
{
n=*m;
clockwise(&m->down,1);
m->front.s[3][1]=n.left.s[3][1];
m->front.s[3][2]=n.left.s[3][2];
m->front.s[3][3]=n.left.s[3][3];
m->left.s[3][1]=n.back.s[3][1];
m->left.s[3][2]=n.back.s[3][2];
m->left.s[3][3]=n.back.s[3][3];
m->back.s[3][1]=n.right.s[3][1];
m->back.s[3][2]=n.right.s[3][2];
m->back.s[3][3]=n.right.s[3][3];
m->right.s[3][1]=n.front.s[3][1];
m->right.s[3][2]=n.front.s[3][2];
m->right.s[3][3]=n.front.s[3][3];
}
}
void MR(Cube *m,int i)//将魔方的左面和右面之间的面以右面为基准顺时针旋转1次
{
Cube n;
for(;i>0;i--)
{
n=*m;
m->up.s[1][2]=n.front.s[1][2];
m->up.s[2][2]=n.front.s[2][2];
m->up.s[3][2]=n.front.s[3][2];
m->front.s[1][2]=n.down.s[1][2];
m->front.s[2][2]=n.down.s[2][2];
m->front.s[3][2]=n.down.s[3][2];
m->down.s[1][2]=n.back.s[3][2];
m->down.s[2][2]=n.back.s[2][2];
m->down.s[3][2]=n.back.s[1][2];
m->back.s[3][2]=n.up.s[1][2];
m->back.s[2][2]=n.up.s[2][2];
m->back.s[1][2]=n.up.s[3][2];
}
}
void MF(Cube *m,int i)//将魔方的前面和后面之间的面以前面为基准顺时针旋转i次
{
Cube n;
for(;i>0;i--)
{
n=*m;
m->right.s[1][2]=n.up.s[2][1];
m->right.s[2][2]=n.up.s[2][2];
m->right.s[3][2]=n.up.s[2][3];
m->up.s[2][1]=n.left.s[3][2];
m->up.s[2][2]=n.left.s[2][2];
m->up.s[2][3]=n.left.s[1][2];
m->left.s[1][2]=n.down.s[2][1];
m->left.s[2][2]=n.down.s[2][2];
m->left.s[3][2]=n.down.s[2][3];
m->down.s[2][1]=n.right.s[3][2];
m->down.s[2][2]=n.right.s[2][2];
m->down.s[2][3]=n.right.s[1][2];
}
}
void MU(Cube *m,int i)//将魔方的上面和底面之间的面以上面为基准顺时针旋转i次
{
Cube n;
for(;i>0;i--)
{
n=*m;
m->front.s[2][1]=n.right.s[2][1];
m->front.s[2][2]=n.right.s[2][2];
m->front.s[2][3]=n.right.s[2][3];
m->right.s[2][1]=n.back.s[2][1];
m->right.s[2][2]=n.back.s[2][2];
m->right.s[2][3]=n.back.s[2][3];
m->back.s[2][1]=n.left.s[2][1];
m->back.s[2][2]=n.left.s[2][2];
m->back.s[2][3]=n.left.s[2][3];
m->left.s[2][1]=n.front.s[2][1];
m->left.s[2][2]=n.front.s[2][2];
m->left.s[2][3]=n.front.s[2][3];
}
}
void MoveCube(Cube *m,char *sur,int i)//根据序列cb转换魔方m
{
SaveChBuf(sur,i);//将魔方转换序列存入chbuf中
if(!strcmp(sur,"f"))
F(m,i);//将魔方的正面顺时针旋转i次
if(!strcmp(sur,"b"))
B(m,i);//将魔方的背面顺时针旋转i次
if(!strcmp(sur,"r"))
R(m,i);//将魔方的右面顺时针旋转i次
if(!strcmp(sur,"l"))
L(m,i);//将魔方的左面顺时针旋转i次
if(!strcmp(sur,"u"))
U(m,i);//将魔方的上面顺时针旋转i次
if(!strcmp(sur,"d"))
D(m,i);//将魔方的底面顺时针旋转i次
if(!strcmp(sur,"mr"))
MR(m,i);//将魔方的左面和右面之间的面以右面为基准顺时针旋转i次
if(!strcmp(sur,"mf"))
MF(m,i);//将魔方的前面和后面之间的面以前面为基准顺时针旋转i次
if(!strcmp(sur,"mu"))
MU(m,i);//将魔方的上面和底面之间的面以上面为基准顺时针旋转i次
}
void InputSurface(Surface *sur)
{
int i,j,a;
for(i=1;i<=3;i++)
for(j=1;j<=3;j++)
{
scanf("%d",&a);
sur->s[i][j]=(Colors)a;
}
}
void Input(Cube *magiccube)//存储魔方
{
printf("Input the colors of the Magiccube:\n");
printf("Blue--------1\tRed---------2\tYellow------3\n");
printf("Green-------4\tWhite-------5\tOrange------6\n\n");
printf("Input the colors of Up:\n");
InputSu
没有合适的资源?快使用搜索试试~ 我知道了~
三阶魔方还原C语言程序.zip_SW1_c_c语言求魔方根_meatzrp_三阶魔方还原
共1个文件
txt:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 181 浏览量
2022-09-21
00:40:01
上传
评论 1
收藏 5KB ZIP 举报
温馨提示
标题中的“三阶魔方还原C语言程序.zip”表明这是一个使用C语言编写的程序,用于解决三阶魔方的还原问题。C语言是一种强大的、低级的编程语言,广泛应用于系统编程、嵌入式开发以及各种算法实现。在这个程序中,开发者可能利用了C语言的高效性能和精确控制特性来实现魔方的算法。 描述中提到,程序“接近一千行”,这暗示着它包含了较为复杂的逻辑和计算过程。对于学习C语言的人来说,阅读和理解这样的程序可以帮助他们提升编程技巧,了解如何组织大型程序的结构,以及如何处理复杂的逻辑问题。魔方还原算法通常涉及到递归、状态空间搜索或特定的数学变换,这些都是C语言编程中的重要概念。 标签中的“sw1”可能是项目或者版本号,但具体含义没有明确的信息。“c c语言求魔方根”可能指的是该程序的目标是找到魔方的根状态,即初始的未打乱状态。“meatzrp”可能是开发者的昵称或程序的特色标识,而“三阶魔方还原”再次强调了程序的主要功能。 压缩包内的“三阶魔方还原C语言程序.txt”文件很可能是程序的源代码文本。学习者可以通过查看这个文件来理解算法的设计思路,包括如何表示魔方的状态,如何定义和执行旋转操作,以及如何寻找解法。此外,源代码中可能还包括了注释,这些注释可以解释程序的不同部分是如何工作的,有助于学习者深入理解C语言和算法设计。 这个压缩包提供了一个很好的学习资源,让C语言初学者有机会接触并分析一个实际问题的解决方案,同时对于熟悉魔方还原算法的人来说,也是一个不错的参考。通过阅读和理解这个程序,不仅可以提升C语言编程能力,还能学习到如何将抽象问题转化为可执行的计算机程序。
资源推荐
资源详情
资源评论
收起资源包目录
三阶魔方还原C语言程序.zip (1个子文件)
三阶魔方还原C语言程序.txt 29KB
共 1 条
- 1
资源评论
周楷雯
- 粉丝: 93
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功