算法-奇数阶魔方

算法-奇数阶魔方

浮生未歇 发布于 2017-05-28 字数 147 浏览 1105 回复 3

这个题目是添魔方阵,所谓n阶魔方是把1到n平方的连续正整数填到一个n * n的方阵中,使得每一列的和,每一行的和,对角线的和都相等。魔方的阶数为奇数

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

瑾兮 2017-08-25 3 楼

小学数学:

我们知道九宫格的口诀:

九子斜排。上下对易,左右相更,四维突出

我们可以从中发现一个规律:
九子斜排,可以认为是将数字以菱形排列
上下对易,左右相更的解释是:
将对角线进行上下交换,左右交换
四维突出,取得即是菱形四边最中间的那个数。
由此可以推论,n奇数阶的魔方应符合这个规律

偏爱自由 2017-06-22 2 楼

这个问题其实你可以去百度一下,是有规律的可遵循的。
奇数阶幻方最经典的填法是罗伯法。填写的方法是:
把1(或最小的数)放在第一行正中; 按以下规律排列剩下的n×(n-1) n*n-1个数:
(1)每一个数放在前一个数的右上一格;
(2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
(3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
(4)如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在前一个数的下一行同一列的格内;
(5)如果这个数所要放的格已经有数填入,那么就把它放在前一个数的下一行同一列的格内。

以上方法也称为楼梯法,可以简单表述如下:
从第一行中间开始是1,每次往右上角移动递增1,如果右上角有数或者没地方,就在原数下面“安家”,如果是右边或者上面没有地方,则向上到底部,向右到左边。
例如3阶幻方:
8 1 6
3 5 7
4 9 2

用C写的代码:

#include<stdio.h>
main()
{
int a[10][10],i,j,k,n;
printf("请输入幻方阶数:");
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=0;
i=1; j=n/2+1;
a[i][j]=1;
for(k=2;k<=n*n;k++)
{
i=i-1;j=j+1;
if(i<1 && j>n)
{
i=i+2;
j=n;
}
else
{
if(i<1) i=n;
if(j>n) j=1;
}
if(a[i][j]==0)
a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
printf("%d阶幻方如下:n",n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%5d",a[i][j]);
printf("n");
}
}

偏爱自由 2017-06-07 1 楼

用lingo或者matlab,里面引进了集合的理论,只要算出其中一行的总和,然后就按条件去做,下面有个参考的资料。
http://zhidao.baidu.com/question/74280976.html

其实原理跟数独差不多,可以百度下数独是怎么做的