- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
〔1〕魔方阵
=1\*GB3①问题描述
魔方阵是一个古老的智力问题,它要求在一个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五阶魔方阵例如
=2\*GB3②根本要求
输入魔方阵的行数m,要求m为奇数,程序对所输入的m作简单的判断,如m有错,能给出适当的提示信息。
实现魔方阵。
输出魔方阵。
=3\*GB3③实现提示
本实验使用的数据结构是数组。
解魔方阵问题的方法很多,这里采用如下规那么生成魔方阵。
由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
源代码:
#includestdio.h
voidmofangzhen(intm)
{inta[100][100];
intb,x,y;
for(x=0;xm;x++)
{for(y=0;ym;y++)
a[x][y]=0;
}
x=0;
y=(m-1)/2;
a[x][y]=1;
for(b=2;b=m*m;b++)
{if(x-10)x=(x-1+m)%m;
elsex=x-1;
if(y-10)y=(y-1+m)%m;
elsey=y-1;
if(a[x][y]!=0)
{x=(x+2)%m;
y=(y+1)%m;
}
a[x][y]=b;
}
for(x=0;xm;x++)
{for(y=0;ym;y++)
printf(%4d,a[x][y]);
printf(\n);
}
}
voidmain()
{intm;
m=0;
while(m%2!=1)
{printf(请输入矩阵阶数m〔奇数):);
scanf(%d,m);
if(m%2!=1)
printf(m输入错误\n);
}
mofangzhen(m);
}
文档评论(0)