奇数阶魔方阵

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了奇数阶魔方阵相关的知识,希望对你有一定的参考价值。

描述

奇数阶魔方阵(又称奇数幻方),所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。

输入

一个小于等于25的正奇数。

输出

奇数阶魔方阵,每个数据的单场宽为4。

样例输入

5

样例输出

11 10 4 23 17
18 12 6 5 24
25 19 13 7 1
2 21 20 14 8
9 3 22 16 15

提示

[分析]:

魔方阵是这样一个方阵,由1,2,3,4……n*n组成,其行、列、对角线元素之和均为常数,比如n=3时的方阵为:

4 3 8

9 5 1

2 7 6

n=5 时的魔方阵可以为:

11 10 4 23 17

18 12 6 5 24

25 19 13 7 1

2 21 20 14 8

9 3 22 16 15

仔细观察上两个方阵可以找出如下的数字“走”的规律:首先将1放置在第(n+1)/2行、第m列的位置上。要放的数增加1,将上一数放的位置行号和列号都增加1,如果增加后超过边界了(即大于n了),则相应的超边界的行号或列号变为1,由新的行号和列号确定的新位置就是新数要放的位置,但有时会有“撞车”的现象,也就是该位置上已放过数字了,此时不能再放了,怎么办?不好走就退回原地再换个方向吧,哪个方向好呢?就是左转了,因为这种情况下一般好象是左边空的。(左转的办法是行号不变,列号减1,此时要不要考虑出界的情况呢?按理应考虑出界的情况的,不过我试了好几个数据都没有发现这种情况,为安全起见,还是加个判定吧)上面这个填数过和直到n*n填完为止。

用free pascal做

如果右上方有数,则退回,试探自己下方1个数,如:5
1
则填:5
1
2
给出程序(两个好像不大一样,但答案都是对的,先凑合着看吧):
program jishumofangzhen;
var
magic:array[1..100,1..100] of integer;
i,j,m,h,l,n:integer;
begin
read(n);
fillchar(magic,sizeof(magic),0);
i:=1;j:=(n div 2)+1; magic[i,j]:=1; m:=1;
repeat
m:=m+1;;h:=i-1;l:=j-1;
if h=0 then h:=n;
if l=0 then l:=n;
if magic[h,l]<>0 then
begin
magic[i+1,j]:=m;
i:=i+1;
end
else
begin
magic[h,l]:=m;
i:=h;j:=l;
end;
until m=n*n;
for i:=1 to n do
begin
for j:=1 to n do
write(magic[i,j]:5);
writeln();
end;
end.
参考技术A 我这个是把你的逆时针旋转90度的:
#include<stdio.h>
void main()
int a[25][25]=0,p,k,i,j,n;
lp:printf("Mofang Jie:");
scanf("%d",&n);
if(n<1||n>25||(n+1)%2!=0)goto lp;
p=0;k=n/2;
a[p][k]=1;
for(i=2;i<=n*n;i++)
if((i-1)%n==0)
if(p==n-1)p=0;
else p++;

else
if(p==0)p=n-1;
else p--;
if(k==n-1)k=0;
else k++;

a[p][k]=i;

for(i=0;i<n;i++)
for(j=0;j<n;j++)
printf("%4d",a[i][j]);
printf("\n");

参考技术B 谁会靠比,很爽的 参考技术C 谁会靠比,很爽的

奇数魔方阵

技术分享图片

由于作者不习惯该编辑器,只是贴出上本文的截图,详见:
https://www.yuque.com/docs/share/269ca547-57bb-4d1d-8345-9c8a50da59cf

以上是关于奇数阶魔方阵的主要内容,如果未能解决你的问题,请参考以下文章

求c语言输出所有三阶魔方阵的方法,

魔方阵的C语言

用C语言输出“魔方阵”

奇数魔方阵

求助C语言高手,关于魔方矩阵的问题

C语言编程,输出魔方阵