如何在PHP中创建一个魔术广场?

时间:2010-05-05 04:12:32

标签: php math numbers puzzle magic-square

我想尝试用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平方),然后快速生成一个新的随机方块。

3 个答案:

答案 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. 形成一个方形矩阵,依次写入数字1到nxn。这是n 魔术广场的顺序,比如5。
  2. 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
    
    1. 我们正试图从上面确定最终的矩阵。表格二 矩阵,一个用于识别行,另一个用于识别行 列。
    2. 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.第二个矩阵是镜像。

      1. 通过写入初始Matrix中的数字来形成最终的Matrix 相应的行和列。对于例如4,3(步骤2)= 18(步骤1)
      2. 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。