我想尝试用PHP创建一个Magic Square(即一个数字网格,所有这些都加起来相同),但我真的不知道从哪里开始。我知道创建魔术方块的许多方法,例如在固定位置开始“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)编写的生成器,但是我在10年前的最后一次Java体验是在我很快放弃它之前。因此,我真的不明白代码实际上在做什么。然而,我注意到,当你生成一个新的正方形时,它会按顺序显示数字1-25(对于5x5平方),然后快速生成一个新的随机方块。
答案 0 :(得分:3)
执行此操作的简单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 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
您将看到第一个Matrix的中间列以1开头 按顺序排列。可以通过减去填充任一侧的列 并添加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的任何订单!
答案 1 :(得分:2)
维基百科有几种用于生成幻方的算法,例如siamese,如果你愿意的话。但正如你所说,这不是一个真正随机的魔术广场。它确实参考了一个遗传算法,想知道你是否能找到更多关于它的细节?
您引用文章使用的方法是使用一些聪明的数学simulated annealing。实际的算法没有在评论中解释,我找不到任何细节的参考。我可以想象在不理解它的情况下复制算法,转录现有的Java - 实现的核心是很少的方法,数组和算术几乎没有任何Java聪明。
答案 2 :(得分:0)
听起来你可以通过递归来解决这个问题吗?
在我看来:用随机数开始某个地方,例如:在右下角, 比你启动一个函数解决行,它调用自己直到所有行都被解决,而一个函数solveField调用自己,直到行中的所有字段都正确放置。 (填充数组)
solceField如果没有限制,则放置一个随机变量2.完成一行的缺失数字(你应该检查它是否放置得太快=>总和可能不会大于剩余的字段连续)
如果你遇到某个地方,你会返回false并返回一行,并在开始时用一个新的随机变量重做行。
直到一切都返回真实并且你有一个maqic square。