奇数阶魔方阵

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

魔方阵 ①问题描述

魔方阵是一个古老的智力问题,它要求在一个m ×m 的矩阵中填入1~m 2的数字(m 为奇数),使得每一行、每一列、每条对角线的累加和都相等,如图1所示。

②基本要求

● 输入魔方阵的行数m ,要求m 为奇数,程序对所输入的m 作简单的判

断,如m 有错,能给出适当的提示信息。 ● 实现魔方阵。 ● 输出魔方阵。 ③实现提示

本实验使用的数据结构是数组。

解魔方阵问题的方法很多,这里采用如下规则生成魔方阵。 ● 由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

④思考

可以考虑使用其他方法生成魔方阵。任何算法都有不同的实现方法,通过采用不同实现方法来重新实现算法,这要比单纯学习算法的效果好得

多。

具体算法:

*/最大可以求99阶魔方阵*/

#include

#include

#define MAX 100

int main(){

int a[MAX][MAX]={0};

int i,m,x=1,y,j;

printf("请输入魔方阵阶数:");

scanf("%d",&m);

if(m%2==0) {printf("请输入奇数\n"); system("pause"); return 0;}

else a[1][(m+1)/2]=1;

y=(m+1)/2;

for(i=2;i<=m*m;i++)

{if(x-1>0&&y-1>0){

x=x-1;y=y-1;

if(a[x][y]==0)

{a[x][y]=i;}

else {x=(x+2)%m;

y=(y+1)%m;

if(x==0) x=x+m;

if(y==0) y=y+m;

a[x][y]=i;}

continue;}

if(x-1<=0&&y-1>0){

x=x-1+m;y=y-1;

if(a[x][y]==0)

{a[x][y]=i;}

else {x=(x+2)%m;

y=(y+1)%m;

if(x==0) x=x+m;

if(y==0) y=y+m;

a[x][y]=i;}

continue;

}

if(x-1>0&&y-1<=0){

x=x-1;y=y-1+m;

if(a[x][y]==0)

{a[x][y]=i;}

else {x=(x+2)%m;

y=(y+1)%m;

if(x==0) x=x+m;

if(y==0) y=y+m;

a[x][y]=i;}

continue;

}

if(x-1<=0&&y-1<=0){

x=x-1+m;y=y-1+m;

if(a[x][y]==0)

{a[x][y]=i;}

else {x=(x+2)%m;

y=(y+1)%m;

if(x==0) x=x+m;

if(y==0) y=y+m;

a[x][y]=i;}continue;

}

}

for(i=1;i<=m;i++){

for(j=1;j<=m;j++){

printf("%5d",a[i][j]);

}

printf("\n");}

system("pause");

return 0;

}

相关文档
最新文档