魔方阵问题
魔方阵算法分析

魔方阵算法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道及答案解析

魔方基础理论知识大全单选题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;}}运行效果如图:。
经典魔方解法(图解)[冰河世纪坛]
![经典魔方解法(图解)[冰河世纪坛]](https://img.taocdn.com/s3/m/42bddae327fff705cc1755270722192e45365880.png)
经典魔方解法(图解)[冰河世纪坛]经典魔方解法(图解)魔术方块解法要一次显示魔术方块的六个面,可以根据以下步骤逐步进行。
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.注:如四角的方块在上述第三步和第四步中到达正确位置,可进行第五步。
魔方阵问题doc

魔方阵问题:把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;}【结果截图】【收获及体会】本次课程设计我选择了一个古老的书序趣味问题——魔方阵,通过我的努力与探索,终于解决了奇数阶魔方阵的算法——左上斜行法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
教师签字:
魔方源代码如下:
#define N 10
#include<stdio.h>
int main()
{int m;
printf("输入小于10的奇数m:");
scanf("%d",&m);
if(m%2==0||m>10)
printf("输入有误,请输入小于10的奇数!\n");
else
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,就说明要填的数的位置已经被占,则该数放在上一个数的下面*/
{
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) /*当行数减到第一行,返回到最后一行*/
实验报告
实验课名称:数据结构实验三
实验名称:魔方问题
班级:20130612
学号:13
姓名:李寅龙
时间:2014-5-25
一、问题描述
问ቤተ መጻሕፍቲ ባይዱ描述
魔方阵是一个古老的智力问题,它要求在一个m×m的矩阵中填入1~m2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等,如图1所示。
15
8
1
24
17
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;
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。
{
i=i+2;
j=j-1;
}
}
printf("魔方如下:\n");
for(i=0;i<m;i++) /*输出数组*/
{
for(j=0;j<m;j++)
printf("%5d",a[i][j]);
printf("\n\n");
}
}
}
}
else /*如果该元素不为0,就说明要填的数的位置已经被占,则该数放在上一个数的下面*/
{
i=i+2;
j=j-1;
}
(3)输出
printf("魔方如下:\n");
for(i=0;i<m;i++) /*输出数组*/
{
for(j=0;j<m;j++)
printf("%5d",a[i][j]);
printf("\n\n");
3.如果上一个数的行数为1,则下一个数的行数为n,列数加1。如果上一个数的列数的n时,下一个数的列数为1,行数减1。
4.如果按上面的规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。
三、算法设计
(1)数据输入
输入小于10的魔方阵的阶数
printf("输入小于10的奇数m:");
}
四、界面设计
程序包含输入提示功能和输出功能提示
五、运行测试与分析
(1)运行程序,显示提示
如果输入有错,程序会报错
(2)数据结果输出。根据实验要求输出实验结果。
六、实验收获与思考
通过本次实验,我对奇数魔方问题有了更加深刻的理解。魔方问题的实现,首先要了解奇数魔方的填充规律,让后把其规律用到程序当中就能实现魔方的填充。