我想尝试用 PHP 创建一个魔方(即所有加起来等于相同值的数字网格),但我真的不知道从哪里开始。我知道创建幻方的许多方法,例如在固定位置开始“1”,然后每次迭代都朝特定方向移动。但这并没有创建一个真正随机的魔方,而这正是我的目标。
我希望能够生成一个由 N² 数字组成的 N×N 幻方,其中每行和每列的总和为 N(N²+1)/2 (例如,一个 5x5 的正方形,其中所有行/列的总和为 65 —对角线无关紧要)。
有人可以提供一个起点吗?我不想让任何人为我做这项工作,我只需要知道如何开始这样的项目?
我知道一个用 Java 编写的生成器(http://www.dr-mikes-math-games-for-kids.com/how-to-make-a-magic-square.html)但我最后一次使用 Java 已经是 10 多年前了,之后我很快就放弃了它。因此,我不太明白这段代码实际上在做什么。然而,我确实注意到,当您生成一个新的正方形时,它会按顺序显示数字 1-25(对于 5x5 的正方形),然后快速生成新的随机正方形。
一个简单的 Java 程序可以做到这一点,可以很容易地用任何语言重写:
/*
* Magic Square
*/
int order = 5;
for (int row = 0; row < order; row++) {
for (int col = 0; col < order; col++) {
int rowMatrix = (((order + 1) / 2 + row + col) % order);
int colMatrix = (((order + 1) / 2 + row + order - col - 1) %
order) + 1;
System.out.print(((rowMatrix * order) + colMatrix) + "\t");
}
System.out.println();
算法:
- 形成一个方阵,依次写入数字 1 到 nxn。这里 n 是
幻方的顺序,比如 5。
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
- 我们试图从上面确定最终的矩阵。表格二
矩阵,一个用于标识行,另一个用于标识
柱子。
4 5 1 2 3 3 2 1 5 4
5 1 2 3 4 4 3 2 1 5
1 2 3 4 5 5 4 3 2 1
2 3 4 5 1 1 5 4 3 2
3 4 5 1 2 2 1 5 4 3
您将看到第一个矩阵的中间列以 1 开头,
是按顺序排列的。两侧的列可以通过减去来填充
并添加 1。第二个矩阵是镜像。
- 通过将初始矩阵中的数字写入
对应的行和列。例如 4, 3(步骤 2)= 18(步骤 1)
18 22 1 10 14
24 3 7 11 20
5 9 13 17 21
6 15 19 23 2
12 16 25 4 8
以上步骤适用于任何订单的Magic Square!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)