文档库 最新最全的文档下载
当前位置:文档库 › 魔方算法

魔方算法

魔方算法
魔方算法

不停的重复一个公式必然回到最开始的状态(转自小站hwt69love)看不懂的请看二楼本人写的,谢谢

1,基本步骤:每个面顺时针90度称为一个基本步骤。共6个基本步骤,一个面一个。转180度,270度,反转。都是他的组合。

2,公式:一组原子旋转的组合步骤。可以是任意次基本步骤的组合。公式所包含的基本步骤数叫做公式长度。

3,对于任何状态,都可以使用任何公式的。对于公式而言,没有哪一个状态是特殊的。4,一个公式所变换的所有状态必定产生一个环(不相交的圆圈)。

命题一:魔方任意旋转,状态数是有限的。

我来简单的说一说证明思路。不用数学公式,但是简单的提提数学概念,帮助大家掌握点数学知识。

命题:一个公式所变换的所有状态必定产生一个环。

命题一:魔方任意旋转,状态数是有限的。

证明:这个命题很关键。先用最直观的方法,对于三阶魔方有六个面,每个面有9个色块,所以共有6*9=54个色块。54个色块的每一种排列组合对应一种魔方状态(一一对应)。大家明白了什么叫状态吗?54的全排列记做54!=54*53*52*51*....*3*2*1。显然这个数目是有限的。魔方的任意旋转所产生的状态不会比这个数目大,因为我贴色块是撕下来贴的,没有限制的。小朋友复原魔方就是这么做的。呵呵!

魔方状态空间

魔方的每一个状态可以看成一个点,魔方的全部状态组成一个空间。

魔方的一个状态也可以看成图论中的一个点。使用一个公式将魔方的一个状态转换成另一个状态,可以使用一条边连接这两个状态,在边的旁边标上这个公式的符号。

请大家想象这样的一幅图。这个图上的点是有限的,并且是联通的,不然就无法转换到其中的一个状态去。并且这个图是封闭的,就是状态中的任何点经过转换还在图中,也就是图都画完了。用群论讲,就是群是封闭的。像全部整数的集合对加法封闭,也就是任何数相加都是整数。但是整数对于开根号运算就不是封闭的,2开2次方就不是一个整数,而且还不是一个有理数(就是不能表示成一个分数)。

命题二,魔方的全部状态空间对于任何公式都是封闭的

魔方的全部状态组成的空间记做H,H是封闭的。

证明一:反证法。如果H是不封闭的,那么必有H中的一个点经过公式转换后生成的点不在H中(如果不存在这个的点,说明H是封闭的,根据封闭的定义),但是H是指“全部状态的集合”,因此假设H不封闭是不成立的。所以H封闭。

证明二:构造法,上面的方法还有点不太严密,如果我们有个方法能生成一个封闭的空间H,那么我们也证明了这个命题。先设空间H为空集,首先增加一个初始点(六面全复原),经过一个公式变换,得到另外一个状态,如果这个状态不在集合H中,把它加入到集合H 中,依次类推,H集合的点数不断增加。根据命题一,H集合的点数是有限的,理论上,这个过程是可以完结的。而且我们已经知道点数不会超过54!。

所以最终H集合是封闭的,也就是不可能再增加新的点啦。

命题三:公式变换是一个一一映射(一一对应)关系

魔方中使用一个公式将一个状态转换到另外一个状态叫做一个变换F。

注意,魔方状态空间H中,一个状态点A,经过一个变换F,转换到状态B。

可以称作从A到B的一个映射,而且这个映射是一一映射。就是在公式F下,状态A只能变换到一个特定状态B,(不可能有两个状态,有时是B,有时是C)。同时在公式F下,状态B也只能由状态A变换过来,不可能从其他的状态转换过来,否则就不是一一对应啦!简单的说,在公式F(或称变换F)下,一个图H(空间H对应的图,我们就不区分了),一个图H中的点“有且只有”两条边,一个入边,一个出边(可以用有向图来描述)。

命题四、一个公式所有变换的点必定在H中画一个圈

命题四、一个公式所有变换的点必定在H中画一个圈,并且这个圈不相交。可以使用拓扑变换变换成一个圆形。

证明:构造法,设H为魔方空间全部点的集合,H…为变换经历过的全部点的集合,从H中任意一点起(设为A点),先将这一点加入H'中,使用公式F变换,得到下一个点(B),这个点要么在H?中,要么不在,如果不在,就将变换后的点(B)加入H…中。最后会得到封闭的空间H',也就是再怎么变换,新点也出不了H'。现在需要证明H'中的全部点加上变换路径形成一个圆圈。由于变换可以无限下去,但是空间H'是有限的,所以必定会形成一个死循环,即一个圈。有没有可能形成一个6字行的图案,还有8字形的图案呢?这是一个重大问题,

但是根据刚才讨论的变换所具有的一一对应,一一映射的性质,除了圆圈外,其他的图案无法形成,这个很直观。

一一对应的图论的解释是,任何点都有两个边,一个入边,一个出边。又要希望形成循环,只有圆圈这样简单的图样了。6,8,9以及更复杂的图样中,必定有一个点有2个以上的边。构造法解释:H?从空集开始构造,首先加入一个原点A,这时对应的图是一个点A,经过一个变换F,如果变换后的点B不在集合H'中,加入点B,这时候后“图”是一个AB线段,再加入一个新点,“图”是ABC组成的线(不相交,可以拉直成直线),任何加入的新点只是延长了线的长度而已。最后图必须封闭,为了满足一一映射的要求,最后一次F变换必定变换到起点A上。如果变换到其他点上,如D点上,那么F的逆变换就有两个,一个逆变换到最后一点,一个逆变换到C点(D的前一点),这与变换的性质不符合。如果还不明白,请复习一一对应,变换,逆变换(一个公式只有一个反向变换公式)。

总结:现在比较圆满的证明了一个公式可以在魔方状态空间H中形成一个圈需要注意两点:一个是魔方状态空间H是有限的,一个是变换是一一映射的性质。

#include

#include

#include

#include

int a[3][3]={1,1,1,1,1,1,1,1,1};

int b[3][3]={2,2,2,2,2,2,2,2,2};

int c[3][3]={4,4,4,4,4,4,4,4,4};

int d[3][3]={3,3,3,3,3,3,3,3,3};

int e[3][3]={5,5,5,5,5,5,5,5,5};

int f[3][3]={7,7,7,7,7,7,7,7,7};

int top[3][3],front[3][3],side[3][3];

int position=0,temp[3]={0,0,0},new[3][3];

int sign;

main()

{

int l=60,x=50,y=50,key,count,input=0,errorcode; int a1[3][3]={1,1,1,1,1,1,1,1,1};

int b1[3][3]={2,2,2,2,2,2,2,2,2};

int c1[3][3]={4,4,4,4,4,4,4,4,4};

int d1[3][3]={3,3,3,3,3,3,3,3,3};

int e1[3][3]={5,5,5,5,5,5,5,5,5};

int f1[3][3]={7,7,7,7,7,7,7,7,7};

int graphdriver=VGA,graphmode=VGAHI;

initgraph(&graphdriver,&graphmode,"");

errorcode = graphresult();

if (errorcode != grOk)

{

printf("Graphics error: %s\n", grapherrormsg(errorcode)); printf("Press any key to exit:");

getch();

exit(1);

}

drawing(x,y,l);

drawing(x+400,y,l/2);

do

{

sign=position%3; copy (&a,&top);

copy (&b,&front);

copy (&c,&side);

color(x,y,l); copy (&e,&top);

change2(&top,1);

copy (&f,&front);

change2(&front,2);

copy (&d,&side);

color(x+400,y,l/2); setcolor(14);

arrow(x,y,l);

key=bioskey(0); switch(key)

{

case 283:printf("Esc"); goto end;

case 20480:setcolor(0);

arrow(x,y,l);

if(position==8)

position=0;

else

position=position+1;

break; case 18432:setcolor(0);

arrow(x,y,l);

if(position==0)

position=8;

else

position=position-1;

break;

case 19712:input=1;

break;

case 19200:input=3;

break;

case 7181: setcolor(0);

arrow(x,y,l);

copy(&a1,&a);

copy(&b1,&b);

copy(&c1,&c);

copy(&d1,&d);

copy(&e1,&e);

copy(&f1,&f);

position=0;

break;

case 14624:setcolor(0);

arrow(x,y,l);

randomize();

position=random(9);

input=1;

break;

}

if(input!=0) {

for(count=0;count

{

if(position/3==0) {

change2(&b,1);

change2(&c,1);

change2(&d,3);

change2(&f,1);

change1(&b,&c);

change1(&c,&d);

change1(&d,&f);

change1(&f,&b);

change2(&b,3);

change2(&c,3);

change2(&d,1);

change2(&f,3);

temp[0]=0;temp[1]=0;temp[2]=0; if(position%3==0)

change2(&a,1);

if(position%3==2)

change2(&e,1);

}

if(position/3==1) {

change1(&a,&b);

change1(&b,&e);

change1(&e,&d);

change1(&d,&a);

temp[0]=0;temp[1]=0;temp[2]=0;

if(position%3==0)

change2(&f,1);

if(position%3==2)

change2(&c,1);

}

if(position/3==2) {

change2(&a,3);

change2(&e,1);

change2(&f,2);

change1(&a,&c);

change1(&c,&e);

change1(&e,&f);

change1(&f,&a);

change2(&a,1);

change2(&e,3);

change2(&f,2);

temp[0]=0;temp[1]=0;temp[2]=0;

if(position%3==0)

change2(&b,1);

if(position%3==2)

change2(&d,1);

}

}

input=0;

}

}

while(1);

end:

clearviewport();

}

drawing(int inital_x,int inital_y,int lenth) {

setlinestyle(0,0,3);

line(inital_x+1.5*lenth,inital_y+0,inital_x+4.5*lenth,inital_y+0);

line(inital_x+1.0*lenth,inital_y+0.5*lenth,inital_x+4.0*lenth,inital_y+0.5*lenth); line(inital_x+0.5*lenth,inital_y+1*lenth,inital_x+3.5*lenth,inital_y+1*lenth); line(inital_x+0,inital_y+1.5*lenth,inital_x+3*lenth,inital_y+1.5*lenth);

line(inital_x+0,inital_y+2.5*lenth,inital_x+3*lenth,inital_y+2.5*lenth);

line(inital_x+0,inital_y+3.5*lenth,inital_x+3*lenth,inital_y+3.5*lenth);

line(inital_x+0,inital_y+4.5*lenth,inital_x+3*lenth,inital_y+4.5*lenth);

line(inital_x+0,inital_y+1.5*lenth,inital_x+0,inital_y+4.5*lenth);

line(inital_x+1.0*lenth,inital_y+1.5*lenth,inital_x+1.0*lenth,inital_y+4.5*lenth); line(inital_x+2.0*lenth,inital_y+1.5*lenth,inital_x+2.0*lenth,inital_y+4.5*lenth); line(inital_x+3.0*lenth,inital_y+1.5*lenth,inital_x+3.0*lenth,inital_y+4.5*lenth); line(inital_x+3.5*lenth,inital_y+1.0*lenth,inital_x+3.5*lenth,inital_y+4.0*lenth); line(inital_x+4.0*lenth,inital_y+0.5*lenth,inital_x+4.0*lenth,inital_y+3.5*lenth); line(inital_x+4.5*lenth,inital_y+0,inital_x+4.5*lenth,inital_y+3.0*lenth);

line(inital_x+1.5*lenth,inital_y+0,inital_x+0,inital_y+1.5*lenth);

line(inital_x+2.5*lenth,inital_y+0,inital_x+1.0*lenth,inital_y+1.5*lenth);

line(inital_x+3.5*lenth,inital_y+0,inital_x+2.0*lenth,inital_y+1.5*lenth);

line(inital_x+4.5*lenth,inital_y+0,inital_x+3.0*lenth,inital_y+1.5*lenth);

line(inital_x+4.5*lenth,inital_y+1.0*lenth,inital_x+3.0*lenth,inital_y+2.5*lenth); line(inital_x+4.5*lenth,inital_y+2.0*lenth,inital_x+3.0*lenth,inital_y+3.5*lenth); line(inital_x+4.5*lenth,inital_y+3.0*lenth,inital_x+3.0*lenth,inital_y+4.5*lenth); }

color(int inital_x,int inital_y,int lenth)

{

int i,j;

int color_num;

int x1=inital_x+1.5*lenth;

int y1=inital_y+0.25*lenth;

int x2,y2;

for (i=0;i<3;i++)

{

x2=x1;

y2=y1;

for (j=0;j<3;j++)

{

color_num=top[i][j]; setfillstyle(1,color_num); floodfill(x2,y2,WHITE); x2=x2+lenth;

}

x1=x1-0.5*lenth;

y1=y1+0.5*lenth;

}

x1=inital_x+0.5*lenth; y1=inital_y+2*lenth;

for (i=0;i<3;i++)

{

x2=x1;

y2=y1;

for (j=0;j<3;j++)

{

color_num=front[i][j]; setfillstyle(1,color_num); floodfill(x2,y2,WHITE); x2=x2+lenth;

}

y1=y1+lenth;

}

x1=inital_x+3.25*lenth; y1=inital_y+2*lenth;

for (i=0;i<3;i++)

{

x2=x1;

y2=y1;

for (j=0;j<3;j++)

{

color_num=side[i][j];

setfillstyle(1,color_num);

floodfill(x2,y2,WHITE);

x2=x2+0.5*lenth;

y2=y2-0.5*lenth;

}

y1=y1+lenth;

}

}

arrow(int inital_x,int inital_y,int lenth)

{

if(position<=2)

{

line(inital_x-30,inital_y+2*lenth-3+position*lenth,inital_x-20,inital_y+2*lenth-3+position*lenth); line(inital_x-30,inital_y+2*lenth+3+position*lenth,inital_x-20,inital_y+2*lenth+3+position*lenth );

line(inital_x-21,inital_y+2*lenth-6+position*lenth,inital_x-15,inital_y+2*lenth+position*lenth); line(inital_x-21,inital_y+2*lenth+6+position*lenth,inital_x-15,inital_y+2*lenth+position*lenth); }

if(position<=5&&position>2)

{

line(inital_x+0.5*lenth+(position-3)*lenth-3,inital_y+4.5*lenth+30,inital_x+0.5*lenth+(position-3)*lenth-3,inital_y+4.5*lenth+20);

line(inital_x+0.5*lenth+(position-3)*lenth+3,inital_y+4.5*lenth+30,inital_x+0.5*lenth+(position-

3)*lenth+3,inital_y+4.5*lenth+20);

line(inital_x+0.5*lenth+(position-3)*lenth-6,inital_y+4.5*lenth+21,inital_x+0.5*lenth+(position-3)*lenth,inital_y+4.5*lenth+15);

line(inital_x+0.5*lenth+(position-3)*lenth+6,inital_y+4.5*lenth+21,inital_x+0.5*lenth+(position-3)*lenth,inital_y+4.5*lenth+15);

}

if(position>5)

{

line(inital_x+3.25*lenth+(position-6)*lenth*0.5-3+5,inital_y+4.5*lenth+30-(position-5)*0.5*lent h+20,inital_x+3.25*lenth+(position-6)*0.5*lenth-3+5,inital_y+4.5*lenth+20-(position-5)*0.5*len th+20);

line(inital_x+3.25*lenth+(position-6)*lenth*0.5+3+5,inital_y+4.5*lenth+30-(position-5)*0.5*lent h+20,inital_x+3.25*lenth+(position-6)*0.5*lenth+3+5,inital_y+4.5*lenth+20-(position-5)*0.5*le nth+20);

line(inital_x+3.25*lenth+(position-6)*lenth*0.5-6+5,inital_y+4.5*lenth+21-(position-5)*0.5*lent h+20,inital_x+3.25*lenth+(position-6)*0.5*lenth+5,inital_y+4.5*lenth+15-(position-5)*0.5*lenth +20);

line(inital_x+3.25*lenth+(position-6)*lenth*0.5+6+5,inital_y+4.5*lenth+21-(position-5)*0.5*lent h+20,inital_x+3.25*lenth+(position-6)*0.5*lenth+5,inital_y+4.5*lenth+15-(position-5)*0.5*lenth +20);

}

}

copy (int *p,int *q)

{

int i,j;

for (i=0;i<3;i++)

{

for (j=0;j<3;j++)

{

*q=*p;

q++;

}

}

}

change1(int *p,int *q) {

int i,ling;

p=p+sign;

q=q+sign;

if (temp[0]==0)

{

for(i=0;i<3;i++)

{

temp[i]=*p;

p=p+3;

}

p=p-9;

}

for(i=0;i<3;i++)

{

ling=*q;

*q=temp[i];

temp[i]=ling;

p=p+3;

q=q+3;

}

}

change2(int *p,int x) {

for (k=0;k

for(i=0;i<3;i++) {

for(j=2;j>=0;j--) {

new[j][i]=*p;

p=p+1;

}

}

p=p-9;

for (i=0;i<3;i++) {

for (j=0;j<3;j++) {

*p=new[i][j];

p++;

}

}

p=p-9;

}

}

魔方阵算法及C语言实现

魔方阵算法及C语言实现 1 魔方阵概念 魔方阵是指由1,2,3……n2填充的,每一行、每一列、对角线之和均相等的方阵,阶数n = 3,4,5…。魔方阵也称为幻方阵。 例如三阶魔方阵为: 魔方阵有什么的规律呢? 魔方阵分为奇幻方和偶幻方。而偶幻方又分为是4的倍数(如4,8,12……)和不是4的倍数(如6,10,14……)两种。下面分别进行介绍。 2 奇魔方的算法 2.1 奇魔方的规律与算法 奇魔方(阶数n = 2 * m + 1,m =1,2,3……)规律如下: 1.数字1位于方阵中的第一行中间一列; 2.数字a(1 < a ≤ n2)所在行数比a-1行数少1,若a-1的行数为1,则a的行数为 n; 3.数字a(1 < a ≤ n2)所在列数比a-1列数大1,若a-1的列数为n,则a的列数为 1; 4.如果a-1是n的倍数,则a(1 < a ≤ n2)的行数比a-1行数大1,列数与a-1相同。 2.2 奇魔方算法的C语言实现 1 #include 2// Author: https://www.wendangku.net/doc/3810429607.html,/ 3// N为魔方阶数 4#define N 115 6int main()7{8int a[N][N]; 9int i;10 int col,row;111 2 col = (N-1)/2;1 3 row = 0;1415 a[row][col] = 1;1617for(i = 2; i <= N*N; i++)18 {19 if((i-1)%N == 0 )20 {21 row++;22 }23

else24 {25// if row = 0, then row = N-1, or row = row - 126 row--;27 row = (row+N)%N;2829 // if col = N, then col = 0, or col = col + 130 col ++;31 col %= N;32 }33 a[row][col] = i;34 }35for(row = 0;row 2// Author: https://www.wendangku.net/doc/3810429607.html,/ 3// N为魔方阶数, 4#define N 1 2 5 6int main() 7{ 8int a[N][N];//存储魔方 9 int i, temp;//临时变量10int col, row;//col 列,row 行1112//初始化1 3 i = 1;14for(row = 0;row < N; row++)15 {16 for(col = 0;col < N; col ++)17 {18 a[row][col] =i;19 i++;20 }21 }2223//翻转中间列24for(row = 0; row < N/2; row ++)25 {26for(col = N/4;col < N/4*3;col ++)27 {28 temp = a[row][col];29 a[row][col] = a[N-row-1][col];30 a[N-row-1][col] = temp;31 }32 }3334//翻转中间行35for(col = 0; col < N/2; col ++)36 {37for(row = N/4;row < N/4* 3;row ++)38 {39 temp = a[row][col];40 a[row][col] = a[row][N-col-1];41 a[row][N-col-1] = temp;42 }43 }4445for(row = 0;row < N; row++)46

简单易学的两种还原魔方的口诀及公式图解详解

图解简单易学的两种还原魔方的常用口诀公式 前言 我们常见的魔方是3x3x3的三阶魔方,英文名Rubik's cube。是一个正6 面体,有6种颜色,由26块组成,有8个角块;12个棱块;6个中心块(和中心轴支架相连)见下图: (图1) 学习魔方首先就要搞清它的以上结构,知道角块只能和角块换位,棱块只能和棱块换位,中心块不能移动。 魔方的标准色: 国际魔方标准色为:上黄-下白,前蓝-后绿,左橙-右红。 (见图2)注:(这里以白色为底面,因为以后的教程都将以白色为底面, 为了方便教学,请都统一以白色为准)。 (图 2)

认识公式 (图3)(图4)公式说明:实际上就是以上下左右前后的英文的单词的头一个大写字母表示 (图5)

(图6) (图7)

(图8) 三阶魔方入门玩法教程(一) 步骤一、完成一层 首先要做的是区分一层和一面:很多初学者对于“一面”与“一层”缺乏清楚的认识,所以在这里特别解释一下。所谓一层,就是在完成一面(如图2的白色面)的基础上,白色面的四条边,每条边的侧面只有一种颜色,图(2). 如图(1)中心块是蓝色,则它所在面的角和棱全都是蓝色,是图(2)的反方向 图(3)和(4)则是仅仅是一面的状态,而不是一层! (1)(2) (3)(4) 注:图(2)和(4)分别是图(1)和(3)的底面状态 想完成魔方,基础是最重要的,就像建筑一样,魔方也如此,基础是最重要的。

由于上文提到过中心块的固定性,这一性质,在魔方上实质起着定位的作用,简单的说就是中心块的颜色就代表它所在的面的颜色。 一、十字(就是快速法中的CROSS ) 第一种情况如图所示: 公式为R2 第二种情况如图所示: (白色下面颜色为橙色,为方便观察,特意翻出颜色) 橙白块要移到上右的位置,现在橙白块在目标位置的下面。但其橙色片没有和橙色的中心块贴在 一起。为此我们先做D’ F’ 即把橙色粘在一起,接着 R 还原到顶层,, F 是把蓝白橙还原到正确的位置(上面的F’ 使蓝白块向左移了九十度)。 公式为D’ F’ R F 图解: 当然,架十字不只只有上面两种情况,现我们在分析下其它的一些情况吧! 如下图: 橙白块的位置己对好,但颜色反了,我就先做R2化成第二种情况,然后用还原第二种情况的 (橙色下面颜色为白色,为方便观察,特意翻出颜色)

新手魔方公式图解

新魔方新手教程
前言
我们常见的魔方是 3x3x3 的三阶魔方,英文名 Rubik's cube 。是一个正 6 面体,有 6 种颜色,由 26 块组成,有 8 个角块;12 个棱块;6 个中心块(和中心轴支架相连)见下图:
(图 1) 学习魔方首先就要搞清它的以上结构,知道角块只能和角块换位,棱块只能和棱块换位,中心块不能移动。
魔方的标准色:
国际魔方标准色为:上黄-下白,前蓝-后绿, (见图 2)注:(这里以白色为底面,因为以后的教程都
面,为了方便教学,请都统一以白色为准)。
魔方还原步骤:
第一层:先还原中间十字,然后还原角块
第二层:还原棱块,右棱五逆五顺,前棱y'五顺五逆 (图 2) 第三层:顶面十字----顶面同颜色----顶层角块----顶层棱块。 还原顶面十字及顶面同颜色时不必考虑顶层侧面的颜色是否正确。
1
左橙-右红。 将以白色为底

认识公式
(图 3)
(图 4)
公式说明:实际上就是以上下左右前后的英文的单词的头一个大写字母表示
(图 5)
2

(图 6)
(图 7)
3

步骤一、完成一层
(图 8)
首先要做的是区分一层和一面:很多初学者对于“一面”与“一层”缺乏清楚的认识,所以在这里特别解释一 下。所谓一层,就是在完成一面(如图 2 的白色面)的基础上,白色面的四条边,每条边的侧面只有一种颜色,图(2).
如图(1)中心块是蓝色,则它所在面的角和棱全都是蓝色,是图(2)的反方向 图(3)和(4)则是仅仅是一面的状态,而不是一层!
(1)
(2)
(3)
(4)
注:图(2)和(4)分别是图(1)和(3)的底面状态
想完成魔方,基础是最重要的,就像建筑一样,魔方也如此,基础是最重要的。
由于上文提到过中心块的固定性,这一性质,在魔方上实质起着定位的作用,简单的说就是中心块的颜色就
代表它所在的面的颜色。
一、十字(就是快速法中的 CROSS)
第一种情况如图所示: 4

魔方阵

问题3.1、n –魔方阵 一、提出问题 所谓“n – 魔方阵”是指由1至n 这n 个不同整数构成的魔方阵,其魔方常数为n ( n + 1 ) / 2。例如,5 – 魔方阵和7 – 魔方阵如图3 – 1所示。易知,这两个魔方阵的魔方常数分别为15和28。 321541543 24321 52154 35432 1 ,4 3217651 76543254321762176543654321732176547654321 图3 – 1 5 – 魔方阵和7 – 魔方阵 n – 魔方阵的数字排列很有规律,若用人工的方法给出并不困难。现在要求给出:能让计算机自动输出n (≥ 3)为奇数时形如图3 – 1所示的n – 魔方阵的算法。 二、简单分析 n – 魔方阵较我们之后将要讨论的奇、偶数阶魔方阵,要简单许多。观察后不难发现: 1.要填入的n 个数字在阵列的每一行和每一列都要出现且仅出现一次,且各行(列)中的数字顺序相同,这里的顺序是指循环顺序,其中数字1接在数字n 的后面。 2.从阵列的行来看,每一行的第一个数字与它上一行正中间的数字相同。 通过对“n – 魔方阵”的分析,下面几个基本问题必须得到解决: ◆ 如何确定阵列第一行各个数字? ◆ 在填入其他行的数字时如何保证数字原有的顺序不改变同时每一行的第一个数字正好是其上一行正中间的数字? 三、设计准备 假设我们要构建的是一个n – 魔方阵,为此定义一个有n 行n 列的二维数组。 1.确定阵列第一行各个数字 这里我们处理的方法很简单,即可以利用循环方法顺序地在二维数组第一行中填写1,2,3,…,n 这n 个自然数即可。 2.填入其他行的数字,并保证数字原有的顺序不改变同时每一行的第一个数字正好是其上一行

魔方快速还原方法-增加图案魔方的方法

魔方的还原方法 第一步:先选定一个中心块颜色作为底层,然后将底层四个边块和四个角块向上,也就是我们通常说的转一面。具体方法略。 第二步:所有的色块都变成一面后,我们需要调整底面的角块和边块,实现 完成第二步后,我们就会得到这样的效果

接下来就要开始学习公式还原了。在开始之前先了解一下魔方复原的术语。 首先要知道3×3×3 魔方的 6 个面的相对叫法和英文缩写: 如图示:前--Front (F),后--Back(B),左--Left(L),右--Right (R),上--Up (U),下-- Down(D). 注:各个面的叫法是根据它们对你的方向所定的,不是根据颜色! 我们还要把这26 块分类: 1) 中心块----六个面的中心就叫中心块(只有一种颜色) 2) 边块----和中心块相邻的由两种颜色组成的块 3) 角块----8 个在角上由三种颜色组成的块

注:a)不管怎样旋转魔方,中心块的位置是不会变的 b)旋转魔方时,边块和角块都会移动,但边块不会移动到角块的位置,同样角块也不会移动到边块的位置!!(这里我们就会想到复原魔方的基本思想就是把角块和边块移动到它"该到的"位置上!!!!) 这里还要理解复原魔方的又一思想----我们是按层的思想复原魔方的,显而易见 3×3×3 魔方分了 3 层---- 上层; 中层; 底层.换句话说就是先复原上面或下面,然后把这层作为底层,然后复原中层,最后是上层!!!! 然后要理解拧法,在本篇文章里归纳起来一共有 3 种法: 1)顺时针旋转(90 度) 2)逆时针旋转(90 度) 3)半圈旋转(180 度) 表示方法: a)顺时针一般不用符号标识 b)逆时针--(') c)半圈--(2 或") 举例: R 顺时针直角旋转右面; U' 逆时针直角旋转上面; F" 旋转前面 180 度 好!理解了以上所讲的内容后我们就可以开始复原魔方了!!!! 第三步:前两步已经把上层复原,这时把魔方颠倒一下,即底层全部复原.所以第三步的目的就是使中层四个边块复位.先在上层找一个应该去中层的边块,然后转动上面,使该边块的侧面与同色的侧面中心块对齐, 然后看符合图 3 还是图 4的情况 , 如果是图 3 做 URU'R'U'F'UF, 如果是图 4 做 U'F'UFURU'R',这样原来在上层的边块就可以复原了. 如果要复原的中层边块就在中层,则应先随便取一个上层边块用图 3 或图 4 的方法去占据要复位的边块所在的位置,使它到上层来再用前面的方法使它复位. 第三步做完后魔方就是这样的了

数据结构 第5章 魔方阵

数据结构 实验报告第五章 实验名称:魔方阵 实验类型:设计性实验 班级: 学号: 姓名: 实验日期:2014年6月7日 1.问题描述 魔方阵是一个古老的智力问题,它要求在一个m×m的矩阵中填入1~m2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等,如图1所示。 基本要求 ●输入魔方阵的行数m,要求m为奇数,程序对所输入的m作简单的判 断,如m有错,能给出适当的提示信息。 ●实现魔方阵。 ●输出魔方阵。 2.数据结构设计 这个问题的数据结构使用数组就可以解决。 3.算法设计 ●由1开始填数,将1放在第0行的中间位置。 ●将魔方阵想象成上下、左右相接,每次往左上角走一步,会有下列情况: ?左上角超出上方边界,则在最下边相对应的位置填入下一个数字; ?左上角超出左边边界,则在最右边相应的位置填入下一个数字; ?如果按上述方法找到的位置已填入数据,则在同一列下一行填入下 一个数字。 以3×3魔方阵为例,说明其填数过程,如图2所示。

图2 三阶魔方阵的生成过程 由三阶魔方阵的生成过程可知,某一位置(x,y)的左上角的位置是(x-1,y-1),如果x-1≥0,不用调整,否则将其调整为x-1+m;同理,如果y-1≥0,不用调整,否则将其调整为y-1+m。所以,位置(x,y)的左上角的位置可以用求模的方法获得,即: x=(x-1+m)%m y=(y-1+m)%m 如果所求的位置已经有数据了,将该数据填入同一列下一行的位置。这里需要注意的是。此时的x和y已经变成之前的上一行上一列了,如果想变回之前位置的下一行同一列,x需要跨越两行,y需要跨越一列,即: x=(x+2)%m y=(y+1)%m 4.运行、测试与分析 (1)程序开始运行并输入。 (2)输出结果。 (3)容错检验。

魔方20秒快速法入门教程

我的魔方解法----简化的CFOP法 魔方快速还原方法中Fridrich的CFOP (Cross+F2L+OLL+PLL魔方吧叫“20秒还原法”)法是很主流的方法,还原速度很快但是有100多个公式要掌握。通过在“魔方吧”的学习,我整理出一个简化的CFOP 方法,这样只需记15个公式就可实现较快的还原魔方。要更快一点,就再多记1个架“十”字公式,本法推荐记16个公式(教程中红色显示)。这比起完整CFOP的(41+57+21=119)个公式来说已大大减轻了负担,本法是一种“中级”的魔方解法,不太适合初学者(初学者还是推荐最简单、公式最少的基本层先法)和只想学会还原的朋友。主要适合学习对象为:1)不愿意记非常多的公式又想还原得快一点的朋友;2)完整CFOP方法的初学者。此法可作为Fridrich方法(CFOP)的入门教程。 一、技术路线 第一、二层采用基本层先的方法(第二层3个公式),第三层采用CFOP法的棱和角一起翻色(此时采用先架棱“十”字,再后用7个OLL公式来完成顶面翻色),然后调棱位置,再调角位置(由于是简化所以不能同时调角和棱的位置),其实就就是把PLL的角和棱分开来完成。 二、具体步骤 1、第一层 现在的目标是在顶上完成第一层(顶层),用架好棱十字(要求顶层四棱的相对位置正确,也就是棱块的侧面色要和对应魔方面的中心块的颜色相同如图1)再对好四角的方法。此步的小技巧是:可以将目标棱块和对应的中心块并到一起后再参加架“十”字。加好顶棱十字后再对好四个角(位置和色向都要对)详细方法可见魔方吧“笑面虎”方法中的内容,因为简单可以自己想出来不再多说了。这时就完在了一层。图2 图1图2 附1:架“十”字另一方法是先将四个目标棱块都转上去架起“十”字,再来调节它们的相对位置,这时要用到两个公式中的一个: 1、相对棱对调R’L U2 R L’ 2、相邻棱对调R’U’R U R’ 2、第二层 由于中心块已固定,所以第二层只有四个棱块没解决了,现在就来解决它。先将第一步中做好的的魔方倒过来(如图3)一般都会出现下面(图4、5、6)几种情况,(有一种特殊情况是四个中层棱都在不在顶上,而是相对错位,此时只要用图4图5的公式做一次便可出现4、5的情况)用对应的公式来解决它们。 图示公式录像

零基础魔方入门教程

零基础魔方入门教程 看完这个你就能复原一个魔方 该教程适合零基础以上的人,会复原以下的人.看完这个教程都能学会复原 写这个教程一个是因为校内上缺乏这类文章,再一个是不同网站的教程步骤大体一样,但细节却略有差别,选取公式各选各的,有些我个人认为真的不是很方便新手记忆,甚至有些书面教程公式不全,没有列出所有可能情况,而且大多数教程没有通俗文字说明,难于学习理解,甚至产生误导,所以写一个我觉得最合适新手看的.这个教程我认为是我见过的最详细最通俗最适合新手的教程. 1.讲几个单词吧,魔方的英文是Rubik's Cube 译为鲁比克方块,Cuber就是魔方玩家的意思.. 2.魔方标准配色 这个新手不用记,架十字的时候再找就行.(如果不清楚架十字是什么意思没有关系,继续往下看,不耽误) 简单了解一下,上面图片就是魔方的标准配色----上黄下白,前蓝后绿,左橙右红. (说了可以不用背下来,知道有这个东西就行,继续往下看) 3.魔方基本构造

大家能了解棱块,角块,中心块这三个概念分别指什么就行了,因为下面的教程会提到,不用管支架. 然后是区分"面"和"层":面是指一个平面的3 x 3块,层是指一个平面3 x 3块所处3 x 3 x 1块. 举个例子:我们旋转的是一层,复原的是六面 (面,层这个东西不理解也没关系,没什么用,大概那个意思就行了,继续往下不用纠结...) 4.魔方算法(公式)符号体系 /魔方在架十字和第一层的时候是可以靠理解的,但是后面需要算法,就是很多人说的公式,(注意,教程里的"算法"就是通常说的"公式",理解成一个意思就行,用算法更恰当一些其实.)大家通常会比较费解在于---我前面做好了再做后面的时候,怎么能不破坏前面呢?是的,正是因为只有极少数人能想出来后面该怎么做还不会破坏前面,所以需要直接记住算法.这里的算法是个什么意思呢?举个例子,你从教学楼到宿舍,会走一条路,这就是一个算法,就是你每次在教学楼想要回宿舍就走这条路,魔方是一样的,你每次看到一种情况就用同样的方法解决它,就是要背一条算法,为什么要背,因为你想不出..所以不得不背,背了以后你下次都会解决这种情况了.不过放心,初级公式情况不多,可以说是--非常少^^ 所以不要担心你掌握不了~/ 那就来介绍一下符号体系吧!很简单,就是英文首字母. F = front 前面 B = back 后面

(纯c语言运行通过)任意阶魔阵算法及规律

任意阶魔方阵算法 20012-05-30 22:51:00| 分类:魔阶作者:王狼杰 我一直就对魔方阵很感兴趣,特别是知道了奇数阶魔方阵的罗伯特算法后,就特别想知道偶数阶魔方阵应有什么算法。当时书上说偶数阶魔方阵比较复杂。都没有什么说明。因此这个问题一直搁在我心里很久,已差不多快忘记了。今天突然又想到了这个问题。于是我开始在网上搜寻,看能不能找到什么好的算法。记得在高中的时候,我就做过魔方阵,当时我从三阶一直做到过八阶方阵,不过用的是人工的方法。到大学的时候我知道了罗伯特算法后,我就用程序将算法写了出来。于是我今天准备把偶数阶的魔方阵也写出来。在网上终于找到了一个比较好的算法。将该算法用C写了出来。供大家分亨。 1、奇数阶幻方 n为奇数(n=3,5,7,9,11……) (n=2*k+1,k=1,2,3,4,5……) 奇数阶幻方最经典的填法是罗伯特法(也有人称之为楼梯方)。填写方法是这样: 把1(或最小的数)放在第一行正中;按以下规律排列剩下的n*n-1个数: (1)、每一个数放在前一个数的右上一格; (2)、如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列; (3)、如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行; (4)、如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在前一个数的下一行同一列的格内; (5)、如果这个数所要放的格已经有数填入,处理方法同(4)。 这种写法总是先向“右上”的方向,象是在爬楼梯。

2、双偶阶幻方 n为偶数,且能被4整除(n=4,8,12,16,20……) (n=4k,k=1,2,3,4,5……) 先说明一个定义: 互补:如果两个数字的和,等于幻方最大数和最小数的和,即n*n+1,称为互补。 先看看4阶幻方的填法:将数字从左到右、从上到下按顺序填写: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 这个方阵的对角线,已经用蓝色标出。将对角线上的数字,换成与它互补的数字。 这里,n*n+1 = 4*4+1 = 17; 把1换成17-1 = 16;把6换成17-6 = 11;把11换成17-11 = 6……换完后就是一个四阶幻方。 16 2 3 13 5 11 10 8 9 7 6 12 4 14 1 5 1 对于n=4k阶幻方,我们先把数字按顺序填写。写好后,按4*4把它划分成k*k个方阵。因为n是4的倍数,一定能用4*4的小方阵分割。然后把每个小方阵的对角线,象制作4阶幻方的方法一样,对角线上的数字换成互补的数字,就构成幻方。下面是8阶幻方的作法:(1) 先把数字按顺序填。然后,按4*4把它分割成2*2个小方阵 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

三阶魔方教程完美打印版

1、魔方常见公式符号说明(重要) 顺时针90度逆时针90度顺时针180度逆时针180度 前层 F(front) 后层 B(back) 右层 R(right) 上层 U(up) 2-1、第一种情况2-2、第二种情况 图2-1 图2-2 公式2-1:(R U R')记忆技巧:白色朝右,第一步就旋转右层公式2-2:(F'U'F)记忆技巧:白色朝前,第一步就旋转前层 2-3、第三种情况 图2-3 用两次公式2-1 (R U R')U' (R U R') 2-4、第四种情况 图2-4 用两次公式2-2 (F'U'F)U(F'U'F) 2-5、第五种情况 图2-5 用三次公式2-1 (R U R')(R U R')U' (R U R')= (R U U R')U' (R U R') 第三步:中棱归位(复原魔方中层四个棱块的步骤) 3-1、第一种情况 图3-1 公式3-1:(U' F' U F )(U R U' R') 3-2、第二种情况 图3-2 公式3-2 :(U R U' R')(U' F' U F) 2、魔方最流行的配色 上黄-下白 前蓝-后绿 左橙-右红 第二步:底角归位(复 原魔方第一层四个角 块) 3、魔方还原方法: 第一步:底棱归位(又 称底部架十字,底层 四个棱块正确复原的 过程) 魔方底层架十字可以无师自通,只是我们这一步要复原的四 个棱块的相对位置顺序要注意,由于我们以白色中心块做底层, 按照现在的主流魔方的贴纸的帖法(上黄下白,前蓝后緑,左橙 右红),如果我们先复原了白蓝这个棱块,那我们在保持白色中心 块在底部的情况下,白红的棱块就一点要放在白蓝棱块的右边, 白橙棱块放在白蓝棱块的左边,白緑棱块放在白蓝棱块的对面, 由于魔方的中心块不会发生变化,所以在复原的过程中,我们是 以中心块为参照物的,第一步我们在复原白蓝、白红、白绿、白 橙这四个棱块的时候,我们可以先把白色面旋转到顶层,和黄色 中心块同一个平面,然后再把他对应的另一个颜色(蓝或红或緑 或橙)经过旋转最上层,使之和对应的中心块的颜色同色,这样 我们再旋转180度,对应的棱块就正确复原到底部了。

魔方还原公式

关于魔方,你需要知道: ?无论怎么转,每一个面的最中间的块[图:1-面中心块]是固定不动的。所以每一面的中心块颜色决定了该面的颜色。 ?无论怎么转,位于顶角的有三种颜色的块[图:2-顶角块]永远会在某一个顶角;位于棱中间的有两种颜色的块[图:2-棱中间块]永远会在某一个棱的中间。 ?所谓的公式,就是用一定的套路告诉你每个面该怎么转。所用到的字母 U D L R F B 分别代表魔方的上下左右前后 6个面。如上图(后方那面 (B)一般不用,所以没有展示)。在字母后加一个撇('),表示把该面逆时针 旋转,不加撇的就是顺时针转。如R’表示右侧面逆时针转。 第一步首面十字 这里以白色面为例。想要转出一个面,最先要转出一个十字形。但是十字也不是随意哪个白色块都可以的。在转出十字的同时,必须保证上层的棱中间块的颜色与该面相同。这个步骤需要自己稍微摸索。如下图:

P.S. 第一步果然很重要,很多同学还是不懂。我前几天也尝试把第一步详细写出来,可是分布情况实在太多,写着写着自己都绕晕了。而且第一步一旦你上手之后就会发现非常的简单。所以请原谅我这根懒惰的神经,这一步就不详细图解了,大家请根据下面那张图和文字摸索一下吧: 1. 要先定位你要复原的棱中心块。比如说,面朝你的一面是蓝色的,最上层是白色的,于是你就要先找到[白-蓝]块到底跑哪去了,然后把它复原到原位,即下图中标有黄色阴影的1号位置。 2. 下一步,打个比方吧,你想要复原[白-红]块。从面中心块可以了解到,完成后的红色面会在蓝色面的右边,在白色面的下面的2号位置。(好吧这里实在忍不住了吐个槽,做图的时候貌似把红蓝色搞反了,大家...将就自动脑补一下吧.....( ̄▽ ̄"))于是当你找到迷失的[白-红]块后,先不要在意第二层的面中心块的颜色,只要保证把它转到下图中的2号位置,然后转一下最上层,你会发现蓝色与蓝色,红色与红色都会对齐的.......

魔方阵解答

P141 5.求Sn=a+aa+aaa+…+aa ….a 之值,其中a 是一个数字。如:2+22+222+2222(n=4),n 由键盘输入。 7.求 ∑∑∑===++100 150110 1 2 1k k k k k k

P168 7.输出魔方阵,所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。

解:魔方阵中各数的排列规律如下: 1.)将1放在第一行中间的一列。 2.) 从2开始直到n×n止各数依次按下列规律存放:每一个数存放的行比前一个数的行数减 1,列数加1(如三阶魔方阵,5在4的上一行,后一列)。 3)如果上一数的行数为一,则下一个数的行数为n(指最下一行)。例如,1在第一行,则2应放在最下一行,列数加1。 4)当上一个数的列数为n时,下一个数的列数应为1,行数减1。例如,2在第3行最后一列,则3应放在第2行第1列。 5)如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。例:4应放在第一行第二列,但位置已被1占据,所以4就放在3的下面。由于6是第一行第三列(即最后一列),故7放在6下面。 N-S图:

10.有一篇文章,共有3行文字,每行80个字符。要求分别统计出其中英文大写字母、小写 字母、数字、空格,以及其他字符个数。

解:N-S图 程序:

P218 4.编写一个函数,使给定的一个二维数组(3×3)转置(行列互换) 10.写一个函数,输入一行字符,将此字符串中最长的单词输出。 分析:单词是由全字母组成的字符串,程序中设longest函数的作用是找最长单词的位置。此函数的返回值是该行字符中最长函数单词的起始位置。Longest N-S图

魔方解法大全_(超简单_超全_带图片)

五阶公式说明五阶魔方降阶法教程五阶魔方层先玩法教程 本教程中讲解的是高级魔方普遍使用的一种方法降阶法,对于五阶魔方来说,我们第一步来完成六面中心块的复原,第二步完成12 个棱块的复原,第三步我们就完全可以用三阶的公式来完成复原了。有兴趣学习层先法的请进入五阶魔方层先玩法教程页面学习。 下面我们介绍几个最基础的几个公式,就可以完成五阶魔方的复原了,相信你掌握了下面几个公式,五阶魔方复原也非常的简单哟。 第一步:形成中心 在我们完成中心块的时候,前面我们完全可以不用公式,自己根据玩魔方的经验,完全可以靠过去的经验完成4面中心块的复原,只是在完成最后两面中心块的过程中为了保持已经完成的四面的中心块不 被破坏,处理用的步骤稍微复杂一点,下面介绍的就是两个这样的公式,其实也就是一点点小小的技巧,很 多朋友估计不看公式也是这样来完成的,在此,我们仅仅是提供一种思路,其中的一些技巧,大家可活学 活用。

公式一:TR' F' MR' F TR F' MR 公式二:TR U TR' U TR U2 TR' 合并中心块,上面的公式仅仅是一种方式,根据上面的公式,也可反向完成,如公式:ML' U' ML ,初学时,仔细领会公式的技巧和规律,理解了公式的意义,不用公式就也能随心所欲复原了。 第二步:集成棱边 在我们完成复原 12个棱块的时候,同样前面我们完全可以不用公式,自己根据玩魔方的经验,完全可以靠过去的经验完成10个棱块的复原,只是在完成最后两个棱块的的过程中为了保持已经完成的10个棱块不被破坏,处理用的步骤稍微复杂一点,下面介绍的就是4个这样的公式,其实也就是一点点小小的技巧,很多朋友估计不看公式也是这样来完成的,在此,我们仅仅是提供一种思路,其中的一些技巧,大家可活学活用。 当我们完全的正确的复原了6面的中心块和12个棱块以后,我们就可以把5阶完全的当作三阶魔方

求魔方阵的十种算法

求魔方阵的十种算法 魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2…n的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。 如3×3的魔方阵: 8 1 6 3 5 7 4 9 2 魔方阵的排列规律如下: (1)将1放在第一行中间一列; (2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列); (3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1; (4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列; (5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面; 1居上行正中央 依次右上切莫忘 上出框时往下写 右出框时左边放 右上有数下边写 右上出框也一样 一、魔方阵的简介 1.何谓矩阵?矩阵就是由方程组的系数及常数所构成的方阵。把用在解线性方程组上既 方便,又直观。 2.何谓n阶方阵?若一个矩阵是由n个横列与n个纵行所构成,共有个小方格,则称这 个方阵是一个n阶方阵。 3.何谓魔方阵?4 9 2 3 5 7 8 1 6定义:由n*n个数字所组成的n阶方阵,具有各对角线, 各横列与纵行的数字和都相等的性质,称为魔方阵。而这个相等的和称为魔术数字。若填入的数字是从1到n*n,称此种魔方阵为n阶正规魔方阵。 4.最早的魔方阵相传古时为了帮助治水专家大禹统治天下,由水中浮出两只庞大动物背

魔方阵问题

实验报告 实验课名称:数据结构实验三 实验名称:魔方问题 班级:20130612 学号:13姓名:李寅龙时间:2014-5-25 一、问题描述 ①问题描述 魔方阵是一个古老的智力问题,它要求在一个m×m的矩阵中填入1~m2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等,如图1所示。 15 8 1 24 17 16 14 7 5 23 22 20 13 6 4 3 21 19 12 10 9 2 25 18 11 图1 五阶魔方阵示例 ②基本要求 ●输入魔方阵的行数m,要求m为奇数,程序对所输入的m作简单的判 断,如m有错,能给出适当的提示信息。 ●实现魔方阵。 ●输出魔方阵。 二、数据结构设计 1.将1放在第一行中间一列。 2.从2开始直到n×n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1。 3.如果上一个数的行数为1,则下一个数的行数为n,列数加1。如果上一个数的列数的n时,下一个数的列数为1,行数减1。 4.如果按上面的规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。 三、算法设计 (1)数据输入 输入小于10的魔方阵的阶数 printf("输入小于10的奇数m:"); scanf("%d",&m); (2)对输入的阶数进行魔方填充 int a[N][N]={0},i=0,j,k; /*先令所有元素都为0*/ j=(m-1)/2; i=0; for(k=1;k<=m*m;) /*开始处理*/ {

if((i<0)&&(j==m)) /*前一个数是第一行第m列时,把下一个数放在上一个数的下面*/ { i=i+2; j=j-1; } else if(i<0) /*当行数减到第一行,返回到最后一行*/ i=m-1; else if(j>m-1) /*当列数加到最后一行,返回到第一列*/ j=0; else if(!a[i][j]) { /*如果该元素为0,继续执行程序*/ a[i][j]=k; k++; i=i-1; j=j+1; } else /*如果该元素不为0,就说明要填的数的位置已经被占,则该数放在上一个数的下面*/ { i=i+2; j=j-1; } (3)输出 printf("魔方如下:\n"); for(i=0;i

三阶魔方公式图解、教程

三阶魔方公式、魔方图解、魔方教程,从零基础到精通! 魔方还原法Rubic's Cube Solution ————先看理论“ 魔方的还原方法很多 在这里向大家介绍一种比较简单的魔方六面还原方法。这种方法熟练之后可以在大约30秒之内将魔方的六面还原。 在介绍还原法之前,首先说明一下魔方移动的记法。魔方状态图中标有字母“F”的为前面,图后所记载的操作都以这个前面为基准。各个面用以下字母表示: F:前面 U:上面 D:下面 L:左面 R:右面 H:水平方向的中间层 V:垂直方向的中间层 魔方操作步骤中,单独写一个字母表示将该面顺时针旋转90度,字母后加一个减号表示将该面逆时针旋转90度,字母后加一个数字2表示将该面旋转180度。H的情况下,由上向下看来决定顺逆时针方向;V的情况下,由右向左看来决定顺逆时针方向。例如 U:将上层顺时针旋转90度 L-:将左面逆时针旋转90度 H2:将水平中间层旋转180度 目录 上层四角还原 下层四角还原 上下层八角还原 上下层边块还原 中层边块还原 上层四角还原 首先我们用最简单的几步使得上层的三个角块归位,暂不必考虑四周的色向位置)。还有一个角块存在五种情况,归位方法如下。 L D L- F- D- F D L2 D- L2 F L D- L- L- F- D F

下层四角还原 上层四角归位后,将上层放在下面位置上,作为下层。然后看上层和四周的颜色和图案排列,按照以下的操作使上层四个角块一次归位。共存在七种情况。 R2 U2 R- U2 R2 R- U- F- U F U- F- U F R R U R- U R U2 R- L- U- L U- L- U2 L R- U- F- U F R R U R- U- F- U- F R U- R- U- F- U F 上下层八角还原 要是上层和下层八个角块色向位置全部相同,存在下面五种情况: 当上下二层八个角块色向位置都不对时:按照(1)旋转。 当下层四个角块色向位置不对,上层相邻两个角块色相位置对时:将上层色向位置相同的两个角块放在后面位置上,按照(2)旋转。 当下层四个角块色向位置对,上层相邻两个角块色相位置也对时:将上层色向位置相同的两个角块放在前面位置上,按照(2)旋转后即变成第一种情况。 当下层四个角块色向位置对,上层四个角块色向位置不对时:按照(2)旋转后即变成第二种情况。 当下层相邻两个角块色向位置对,上层相邻两个角块色向位置也对时:将下层色向位置相同的两个角块放在右面位置上,上层色相位置相同的两个角块放在前面位置上,按照(2)旋转之后即变成第二种情况。 (1) R2 F2 R2 (2) R- D F- D2 F D- R 上下层边块还原 按照下图所示操作方法将上下层的边块归位。在上层边块归位时,要注意四周的色向位置。留下一个边块不必马上归位,留作下层边块归位时调整使用。 上层三个边块归位之后,将该层放在下面位置上作为下层,然后将上层的四个边块归位。操作时,为了不破坏下层已经归位的边块,必须将下层留下的一个未归位的边块垂直对着上层要归位的边块的位置。 R- H- R R H R- F H- F- V- D2 V F H- F2 H2 F

玩魔方的方法

只要7步,就能将任何魔方6面还原(留着以后教孩子玩) 破解攻略和大家分享下: 首先,破解魔方,我们就要先了解它的结构,魔方共6色6面,每面又分为中央块(最中间的块6个)、角块(4角的块8个)和边块(4条边中间的块12个)。其中中央块只有1个面,他们是固定的结构,所以中央是红色的块,那么其他的红色都要向这个面集中。而且红色的中央块对面永远是橙色中央块(国际标准是这么规定的)。而边块有2个面2个颜色,角块则有3个面3个颜色。 接下来我们将每个面都用字母代表,

然后破解功略里会用字母来说明要转动的1层或1面,以及方向:例如:R(代表右面顺时针转90度),R`(代表右面逆时针转90度),R2(代表右面顺时针转2次90度) 下面是图示: 最后要说明的是:每面的名称是相对的,例如F是前面,就是手拿魔方时面向自己的一面,若把模仿旋转到另一面,那么就有新的一面成为前面。 好了 下面就让我们尝试下7步将魔方还原吧!

1.先将中间是白色块的一面(有个rubiks logo的那块)对着上面,然后在顶部做出白十字,就是其他颜色的块都到相应的位置(小复杂,见图示,注意上面标的口诀哦,照做无误) 2.然后是将白色的角块归位(秘籍说的很复杂,还是看图比较容易理解啦)

3.然后让中层边块归位。 把白色面转向下,找出红绿边块,若红绿边块在顶层则按顺时针方向转动顶层,直到边块与图上的1个情况相同,在按照口诀转动魔方,使边块归位。若红绿边块在中间某层,但位置错误或颜色错误,则先使红绿边块在右前方的位置,再重新按照下面其中一个次序旋转1次。

4.然后将顶层(应该是黄色)边块调整向上,做出黄十字。若按照口诀转动1次后,顶层仍未出现黄色十字,可重复按口诀转动,直到黄色十字出现为止。

三阶魔方公式

基本概念:F = front face 前面 B = back 后面L = left 左面R = right右面U = up 上面 D = down 下面 当旋转魔方的右边时,从右侧看,若按顺时针转动90度,则用“R”表示这一旋转动作,若按反时针方向转动90度,则用“Rˊ”,若将“R”面顺时针旋转180度,则用“R2” 下图介绍的三阶魔方的玩法(层先法)复原的基本步骤示意图: 一、还原第一层 (1)、第一步:底棱归位(又称底部架十字,底层四个棱块正确复原的过程)第一步我们在复原白蓝、白红、白绿、白橙这四个棱块的时候,我们可以先把白色面旋转到顶层,和黄色中心块同一个平面,然后再把他对应的另一个颜色(蓝或红或緑或橙)经过旋转最上层,使之和对应的中心块的颜色同色,这样我们再旋转180度,对应的棱块就正确复原到底部了。 第二步:底角归位(复原魔方第一层四个角块)

在这里会有几个公式: 公式2-1:(R U R')公式2-2:(F'U'F) 用两次公式2-1: (R U R') U' (R U R')

用两次公式2-2 (F'U'F)U (F'U'F) 用三次公式2-1 (R U R')(R U R') U' (R U R') 二、还原第二层在这里有两个公式 第三步:中棱归位(复原魔方中层四个棱块的步骤) 公式3-1:(U' F' U F )(U R U' R') 公式3-2 :(U R U' R')(U' F' U F)

三、还原顶面 第四步:顶棱面位(也称顶层架十字,顶层四个棱块的顶面颜色和顶层中心块颜色一样) 这里我们会有几个公式

公式4:F (R U R' U')F',两遍公式4

魔方口诀技巧

怎样玩魔方(转录) 魔方曾被誉为世界三大智力玩具之一,不过现在我不敢这么说了。什么?另外 两个是什么?你可记住了:那是我们中国的九连环和捉放曹啊! 魔方可以拆开。废话!不过……你拆开过吗?如果没有,赶快把魔方一块一块 地卸下来,嘿嘿嘿,是不是有一种打DOOM怪物的感觉?卸下来了吗?可以看到, 除了骨架上的六个不同颜色的中心积木外,还有8个角上的积木和12个棱上的积 木。中心积木只有一种颜色,棱上的积木有两种颜色,角上的积木有三种颜色。 不管怎么说,没有两块积木是完全相同的。骨架上的中心积木是不能动的,所以中 心积木与中心积木的相对位置是确定不变的,所以角上棱上的积木的正确位置也是 不变的。例如一个红黄蓝色的角积木,它的正确位置就在红黄蓝中心积木对应面的 角上。我们的任务就是把棱积木、角积木转到它们自己的位置上。 废话少说,快来观摩一下我的规划图吧: 图1 从现在起我们就要开始玩魔方了,现在的任务是完成魔方的一面。 首先选择你要玩的面颜色,在这里我选择兰色进行教学,因为我喜欢兰色^_^, 我们将该颜色的中心积木所在的面称为基面。 图2 图3 图4

为了避免玩家转来转去找不到魔方的方向了,我们统一规定,魔方摆放如图2所示,另外在图3中我们要将外面的兰色块转入基面的黑色块位置时,却不能影响阴影积木,这也是玩魔方的难点。对于其他没着色的积木,都是些无关紧要的积木,可不去理会,把注意力集中在基面外面的操作块、操作块的目标位置和不可受到影响的积木上。(注:在操作的步骤中,阴影积木可以移动,但要保证步骤完毕后,阴影积木无变化) 对于魔方一面的完成,我们是一个一个操作块地完成的,饭也是一口一口地吃嘛!转时,一定要找准操作块的真正目标所在,要注意操作块的附加颜色,否则失败。如图4,黄蓝色块与绿蓝色块颠倒,所以兰色一面成功了也没有用。 下面是一些最基本的将操作块转入基面的功夫,可要认真揣摩呀! 图5 图6 简要说明:图中阴影块是目标位置,注意哟,我可没有标记不可受影响的积木哟。另外,要注意操作块相对于目标位置的区别,不同的位置用不同的方法。如图6所示,基面外兰色标记的块,都可以通过转动使其到达A位置或者B位置,然后再用1方法完成到达目的位置的任务。 图7 图8 当目标块在背面时,可以通过图7这三步将目标块转到侧面来,然后转到A位置,用1方法完成到达目的位置的任务。触类旁通,如面图8所示,基面外兰色标记的块,都可以通过转动使其到达A位置,然后再用2方法完成到达目的位置的任务。

相关文档