魔方阵问题
- 格式:doc
- 大小:60.55 KB
- 文档页数:5
魔方阵算法2008-11-22 17:12幻方问题分为奇幻方和偶幻方。
奇幻方和偶幻方方阵的布阵规律不同,而偶幻方又分为是4的倍数(如4,8,12,16,20等)和不是4的倍数(如6,10,14,18等)两种。
现在就幻方的三种情形的布阵规律分别加以介绍。
A方案1、奇幻方N=2*M+1(M=1,2,3,……)的布阵规律a、把1放在N*N方阵中的第一行中间一列,即放在位置为(1,(N+1)/2);b、后一个数存放的行数比前一个数存放的行数减1,若这个行数为0,则取行数为N;c、后一个数存放的列数比前一个数存放的列数加1,若这个列数为N+1,则取列数为1;d、如果前一个数是N的倍数,则后一个数存放的列数不变,而行数加1。
B方案⑴将1放在第一行中间一列;⑵从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);⑶如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;⑷当上一个数的列数为n时,下一个数的列数应为1,行数减去1。
例如2在第3行最后一列,则3应放在第二行第一列;⑸如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。
例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;2、①偶幻方N=4*(M=1,2,3,……)的布阵规律先将1至N*N由小到大的顺序,从第一行开是依序填入N*N的方阵中,然后将N*N的方阵以4行4列划分为若干个4*4的小方阵,再将所有4*4小方阵的两个对角线上的数字划掉,之后将所有被划掉的数字重新由大到小的进行排列,然后再将这些数字按排列顺序由N*N方阵的第一行开始,放入被划掉的格子中去。
则此时的偶幻方也就布好阵。
2、②偶幻方N=4*(M=1,2,3,……)的布阵规律本法先將數字順序填入方陣之後,再施以兩階段的翻轉,一次縱向、一次橫向,故名雙向翻轉法。
问题3.1、n –魔方阵一、提出问题所谓“n – 魔方阵”是指由1至n 这n 个不同整数构成的魔方阵,其魔方常数为n ( n + 1 ) / 2。
例如,5 – 魔方阵和7 – 魔方阵如图3 – 1所示。
易知,这两个魔方阵的魔方常数分别为15和28。
3215415432432152154354321 ,4321765176543254321762176543654321732176547654321 图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.填入其他行的数字,并保证数字原有的顺序不改变同时每一行的第一个数字正好是其上一行正中间的数字要解决这个问题,需借助一个有n + 1单元的一维数组,并对该数组进行若干次“循环左移”处理。
所谓做一次“循环左移”,即指在一维数组中,将第1个数填入第n + 1个单元,第2个数填入第1个单元,……,第n个数填入第n– 1 个单元,最后再将第n + 1个单元中的数填入第n个单元。
魔方基础理论知识大全单选题100道及答案解析1. 标准三阶魔方一共有多少个小方块?()A. 26B. 27C. 36D. 54答案:B解析:标准三阶魔方由27 个小方块组成。
2. 魔方是由哪个国家的人发明的?()A. 美国B. 匈牙利C. 中国D. 日本答案:B解析:魔方是由匈牙利人厄尔诺·鲁比克发明的。
3. 三阶魔方还原过程中,第一步通常是?()A. 还原底层十字B. 还原底层角块C. 还原顶层十字D. 还原顶层角块答案:A解析:三阶魔方还原的第一步通常是构建底层十字。
4. 魔方的六个面颜色通常不包括?()A. 红色B. 紫色C. 蓝色D. 绿色答案:B解析:魔方六个面的标准颜色通常是白、黄、红、橙、蓝、绿。
5. 三阶魔方还原的最后一步是?()A. 顶层角块归位B. 顶层棱块归位C. 中层棱块归位D. 底层棱块归位答案:B解析:三阶魔方还原的最后一步是顶层棱块归位。
6. 以下哪种情况不属于魔方的非法转动?()A. 单独转动一个角块B. 整体转动魔方C. 同时转动两个棱块D. 按公式转动答案:D解析:按正确的公式转动魔方是合法的,而单独转动一个角块、同时转动两个棱块是非法的。
7. 三阶魔方中,一个角块有几种颜色?()A. 1B. 2C. 3D. 4答案:C解析:一个角块由三个面组成,有三种颜色。
8. 魔方还原方法中,“CFOP”法中的“F”代表什么?()A. 底层十字B. 底层角块C. 中层棱块D. 前两层答案:D解析:“CFOP”法中,“F”代表前两层(First Two Layers)。
9. 魔方比赛中,常用的计时工具是?()A. 手表B. 手机C. 秒表D. 时钟答案:C解析:魔方比赛中通常使用专业的秒表来计时。
10. 三阶魔方的中心块有几个?()A. 6B. 8C. 12D. 24答案:A解析:三阶魔方有6 个中心块。
11. 以下哪种魔方不是常见的异形魔方?()A. 镜面魔方B. 粽子魔方C. 五阶魔方D. 斜转魔方答案:C解析:五阶魔方属于标准的正方体魔方,不是异形魔方。
数据结构与程序设计实验实验报告
哈尔滨工程大学
实验报告三
c. 如果按上述方法找到的位置已填入数据,则在同一列下一行填入下一个数字。
(3). 以3×3魔方阵为例,说明其填数过程,如下图所示。
三阶魔方阵的生成过程
由三阶魔方阵的生成过程可知,某一位置(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
printf("%d\t",a[i][j]);
printf("\n");
}
四、界面设计
程序需要获取魔方阵的阶数(包括错误判断),输出结果,均在执行过程中给出提示。
五、运行测试与分析
1. 获取阶数并给出错误提示
2. 获取正确阶数,并输出结果
六、实验收获与思考
本次实验采用的数据结构为二维数组,在使用过程中巩固了学习的知识,在用C语言实现魔方阵算法时对C语言的使用更加熟悉。
七、附录(原程序)。
输出魔方阵。
魔方阵是指这样的方阵,它的每一行,每一列和对角线之和均相等。
20.输出魔方阵。
魔方阵是指这样的方阵,它的每一行,每一列和对角线之和均相等。
/*输出魔方阵。
魔方阵是指这样的方阵,它的每一行,*每一列和对角线之和均相等。
*/#include <stdio.h>/*声明常量SIZE值,限制数组的大小*/#define SIZE 16/*声明函数input按魔方阵的要求读取数组*/void input(int[][SIZE],int);main(){/*将二维数组a初始化为0,x,y用于控制行与列,*n存储要输出的数组长与宽*/int a[SIZE][SIZE]={0},x,y,n;printf("enter n(1 to %d):",SIZE-1);scanf("%d",&n);/*应用函数读取数组*/input(a,n);/*按行与列要求输出数组*/for(x=1;x<=n;x++){for(y=1;y<=n;y++)printf("%4d",a[x][y]);printf("\n");}return(0);}/*定义函数input按魔方阵的要求读取数组*/ void input(int a[][SIZE],int n){int x,y,i;/*按要求决定数组的第一个元素*/y=(n+1)/2;x=1;a[x][y]=1;/*按要求将2到n平方的值依次赋予数组元素*/ for(i=2;i<=n*n;i++){x-=1;y+=1;if((a[x][y]!=0)||(x==0&&y==n+1)){y-=1;x+=2;if(x>n)x=1;}if(x<1)x=n;if(y>n)y=1;a[x][y]=i;}}运行效果如图:。
经典魔方解法(图解)[冰河世纪坛]经典魔方解法(图解)魔术方块解法要一次显示魔术方块的六个面,可以根据以下步骤逐步进行。
1.显示第一表面和第一层要显示第一面,可能遇到以下情况,这时,可根据如下五种方法之一去做。
(1)(2)(3)(4)180°(5)180° 180°可根据上述任何一种方法完成任何一面。
请注意当完成一个表面时,四边颜色应一致,且第一层应转至四边颜色与各自中心一致。
如下:要使第一层四边的颜色一致,有两种方法。
如下图:(1)180° 180°(2)180°2.转动面上的第二层按上述步骤,第一层表面可显示出来。
(即四边的最顶层)然后进行第二层。
这时要把已完成的第一层倒过来,使"T"颠倒成"⊥"(如图)。
有以下种方法调出第二层。
(1)(2)注:如遇到图中所示情况,方块A周边的颜色将互相取代,可连用上述方法(1)或(2),这时把B或C转到A的位置,然后再把A转到B或C的位置,然后以同样的方法再转一次,可连用(1)或(2)把方块A转到原始的位置,做完后,其两边的颜色应互相替代。
完成上述步骤后,第二层就会变成如图所示的情况。
3.完成第二层后,尽量将第三层之顶部成”+”形将。
(如图)当”「”形出现时,顶层应转到出现”」”在左上角。
根据第二步,不管第三层顶面出现什么形状,要按以下方法去重复转动,直至出现”+”。
当”+”出现,再进行第四步。
4.把顶面四角的方块转到正确位置根据上述三个步骤可使顶面出现”+”形状,尽量使四角的方块颜色与毗邻三面颜色一致。
然而,颜色不一定处在所需位置,如发生一方块处于正确位置(颜色可能不是这种情况),如第三步的最后所述,这一角可用作参照点,根据箭头所示方向连用如下方法(1)或(2)改变其它三个角。
(1)移动 I 到 II, II 到 III 和 III 到 I.(2)移动 I 到 III, II 到 I 和 III 到 II.注:如四角的方块在上述第三步和第四步中到达正确位置,可进行第五步。
魔方阵问题:把1到n 2(n 为奇数)个自然数按方阵排列,使得方阵的每行、每列以及沿对角线的几个数之和都等于方阵常量,这个常量是:(21)n(n 2+1)。
例如,1至9可以排成如图所示的方阵,方阵常量是(21)*3*(32+1)=15。
提示:各数在魔方阵中的位置可按下述方法确定:通常1总是在第1行的中间;对于其他自然数来说,目前数的右上方是下一个数的位置,若右上方已经赋值,则下一个数的位置在其下方;如果目前数在第1行,但不在最右侧,则下一个数在最后一行,列数右移一列;如果目前数在第1行的最右侧,则下一个数在目前数的下侧;如果目前数在其他行的最右侧,则下一个自然数在上一行的最左侧。
用二维数组存放魔方阵。
【完成题目2】魔方阵【问题描述】魔方阵是一个古老的智力问题,它要求在一个m*n的矩阵中填入1~m2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等,如下图所示:(a)三阶魔方阵(b)五阶魔方阵【基本要求】1.输入魔方阵的行数m,要求m为奇数,程序对所输入的m作简单的判断,如m有错,能给出提示信息;2.实现魔方阵;3.输出魔方阵。
【算法设计】首先,输入一个数字m(0<m<100),则输出对应的m阶魔方阵,并输出每一行、每一列、每条对角线上各个数字累加和。
若输入数字m超出要求范围或数字m为偶数或数字m<0,则提醒用户输入错误,需重新输入m。
使用多维数组输出魔方阵。
输入形式:数字m(0<m<100)。
输出形式:以矩阵形式输出n(0<m<100)阶奇数魔方阵;【源代码】#include <iostream>using namespace std;int main(int argc, char* argv[]){int i,j,m,k;//i:行,j:列,m:阶数,k:矩阵int a[100][100];cout<<"请输入一个奇数m (0<m<100):";loop1: cin>>m; //loop:循环if(m%2==0||m<0||m>=100){cout<<"输入错误!请重新输入一个奇数n (0<m<100):";goto loop1;}i=0;j=m/2;for(k=1;k<=m*m;k++){a[i][j]=k;if(k%m==0)i++;//行数加1else{i=(i==0)?m-1:i-1;j=(j==m-1)?0:j+1;}}for(i=0;i<m;i++){for(j=0;j<m;j++){cout<<a[i][j]<<" ";}cout<<endl;}return 0;}【结果截图】【收获及体会】本次课程设计我选择了一个古老的书序趣味问题——魔方阵,通过我的努力与探索,终于解决了奇数阶魔方阵的算法——左上斜行法。
奇数阶魔方阵一、提出问题所谓“奇数阶魔方阵”是指n 为不小于3的奇数的魔方阵。
这类魔方阵的形式多样,这里我们仅讨论其中的一种形式的正规魔方阵。
例如:3阶、5阶和7阶的魔方阵如图3 – 4 所示。
294753618 ,92251811321191210222013641614752315812417 ,20112494031221234341322321444423324151345363425161453735261786462927189747382819101183930 图3 – 4 3阶5阶和7阶魔方阵容易知道,这三个魔方阵的魔方常数分别是15、65和175。
现在要求给出:能让计算机自动输出类似图3 – 4 所示的n 阶奇数魔方阵的算法,其中n 为任意给定的一个不小于3的奇数。
二、简单分析决定“奇数阶魔方阵”的关键是要按要求决定其方阵中的各个数字。
观察图3 – 4中的三个奇数阶魔方阵,不难发现:1.由于是正规魔方,故所填入的n 2个不同整数依次为1、2、3、…、n 2 ;2.各行、列和对角线上的数字虽各不相同,但其和却是相同的。
这表明,其魔方常数可由公式n ( n 2 + 1 ) / 2得到。
3.数字在阵列中的次序,并没有遵从阵列单元的行、列下标的顺序,但数字“1”却始终出现在阵列第一行的正中间位置,而数字“n 2”也始终出现在阵列第n 行的正中间位置,这说明阵列中的数字排列应该是有一定规律的。
通过对两个奇数阶魔方阵的简单分析,下面几个基本问题必须得到解决:◆ 奇数阶魔方阵中的数字有些什么规律?◆ 数字“1”的位置应如何确定?三、设计准备1.奇数阶魔方阵中的数字规律通过对奇数阶魔方阵的分析,其中的数字排列有如下的规律:(1)自然数1出现在第一行的正中间;(2)若填入的数字在第一行(不在第n 列),则下一个数字在第n 行(最后一行)且列数加1(列数右移一列);(3)若填入的数字在该行的最右侧,则下一个数字就填在上一行的最左侧;(4)一般地,下一个数字在前一个数字的右上方(行数少1,列数加1);(5)若应填的地方已经有数字或在方阵之外,则下一个数字就填在前一个数字的下方。
三阶幻方20道题一、基础数字型1. 用1 - 9这九个数字组成一个三阶幻方,使每行、每列、每条对角线上的数字之和都相等。
这就像是把9个性格各异的小伙伴(1 - 9这些数字)安排在一个九宫格的小房间里,让每行、每列、每条对角线上的小伙伴凑在一起的力量(数字之和)都一样呢。
2. 请用3、4、5、6、7、8、9、10、11这九个连续的数字构建一个三阶幻方。
想象一下,这就像把九个连续的小怪兽按照特殊的规则(幻方规则)关在九宫格的笼子里,让它们横竖斜都保持一种神秘的平衡。
3. 用5、6、7、8、9、10、11、12、13构建三阶幻方。
这九个数字就像九个魔法小精灵,要让它们在九宫格这个魔法阵里站好位置,使得每行、每列、每条对角线小精灵的魔力总和(数字之和)是一样的哦。
二、给定和值型4. 构建一个三阶幻方,要求每行、每列、每条对角线上的数字之和为15。
这就像是一场数字的聚会,每个数字都要找到自己的位置,让三个数字凑在一起的总和是15这个神奇的数字。
5. 构造一个三阶幻方,其每行、每列、每条对角线上的数字之和为18。
你可以把它想象成一个数字拼图游戏,把合适的数字放进九宫格,让它们达到18这个“小目标”。
6. 制作一个三阶幻方,使得每行、每列、每条对角线上的数字之和为21。
这就像要把数字当作小砖头,砌成一个九宫格的小房子,而且这个小房子的每条边(行、列、对角线)所用砖头数量之和(数字之和)得是21呢。
三、部分数字给定型7. 在三阶幻方中,左上角的数字是1,其他数字未知,请完成这个幻方。
这就像在一个神秘的九宫格迷宫里,你已经知道了入口(左上角数字1),现在要根据幻方的魔法规则找到其他数字的出口。
8. 已知三阶幻方中间一格的数字是5,构建完整的幻方。
这个5就像九宫格的中心小太阳,你要围绕着它放置其他数字,就像行星围绕太阳一样,让整个幻方符合规则。
9. 三阶幻方的右下角数字是9,请完成这个幻方。
这个9就像一个小尾巴,你得从这个小尾巴开始倒推,把其他数字合理地安排在九宫格中。