魔方阵算法

作为一次实验,我正在尝试创建一个魔方程序,检查每个可能的九个数字方格。对于不知道的人来说,魔方是一个由数字1-9组成的3x3数字网格,其中每行、每列和每条对角线的总和都为15。例如:

http://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Magicsquareexample.svg/180px-Magicsquareexample.svg.png

我如何使用Lua中的表来检查每个方格?我从以下表格开始:

local sq = {
    1, 1, 1,
    1, 1, 1
    1, 1, 1
}

我该如何按正确顺序检查每个表格?我能够在纸上画出自己的想法,但我不完全确定如何将其转换为代码。我已经创建了一个函数来检查方格是否是“魔法的”(如下所示),但我不确定如何以正确的方式增加每个数字。

local isMagic = function(s)
    return (
        s[1] + s[2] + s[3] == 15 and
        s[4] + s[5] + s[6] == 15 and
        s[7] + s[8] + s[9] == 15 and
        s[1] + s[4] + s[7] == 15 and
        s[2] + s[5] + s[8] == 15 and
        s[3] + s[6] + s[9] == 15 and
        s[1] + s[5] + s[9] == 15 and
        s[3] + s[5] + s[7] == 15
    )
end
点赞
用户3378649
用户3378649

根据我在这里看到的,有三种模式:

1)如果我们能够定义步长为3,我们将比较列:
sum(tab [x] for x in range(step))== sum(tab [x] for x in xrange(step + 1,step * 2))== sum(tab [x] for x in xrange(2 * step + 1,step * 3))

2)行:
sum(tab [x] for x in range(step * step)if x%step == 0)== sum(tab [x] for x in range(step * step)if x%step == 1)== sum(tab [x] for x in range(step * step)if x%step == 2)===> 直到 x%step == step-1

3)对角线:
sum(tab [x] for x in range(step * step)if x%(step + 1)== 0)== sum(tab [x] for x in range(step * step)if x%(step + 1)== step-1)
2014-10-20 02:06:04
用户3911769
用户3911769

首先,您有一个2D集合,为什么要使用1D列表?

我更希望您的正方形是这样的:

square[1-3][1-3]

这样您就可以检查每个X轴上的每一行和每个Y轴上的每一列,然后检查两个对角线。

而不是:

square[1-9]

在这种解决方案中,您必须硬编码检查,这将不允许您设置其他正方形尺寸而不编写新代码。

就像这样:

local square = {}
square[1] = {[1] = 2, [2] = 7, [3] = 6}
square[2] = {[1] = 9, [2] = 5, [3] = 1}
square[3] = {[1] = 4, [2] = 3, [3] = 8}

这是检查正方形是否为幻方的代码。你可以根据需要设置尺寸。

#!/usr/local/bin/lua

    function checkTheSquare(square, check_for)
        local dia_sum     = 0   -- 我们将在这里添加对角线(从左上到右下)的值
        local inv_dia_sum = 0   -- 我们将在这里添加对角线(从右上到左下)的值

      for i = 1, #square do     -- 对于正方形中的每个[i]行
        local temp_sum    = 0   -- 临时保存[i]行的值

        for j = 1, #square do   -- 对于正方形中的每个[j]行
          temp_sum = temp_sum + square[i][j]   --将square[i] [j]的值添加到temp中
        end

        dia_sum = dia_sum + square[i][i]
        -- 这将按照以下方式执行:[1][1] -> [2][2] -> [3][3] ...

        inv_dia_sum = inv_dia_sum + square[i][#square-i+1]
        -- 这将按照以下方式执行:[1][3] -> [2][2] -> [3][1] ...

        if temp_sum ~= check_for then return false end
        -- 第一行出现错误 -> 不是幻方

      end

      if dia_sum ~= check_for and inv_dia_sum ~= check_for then
        return false
        -- 不是幻方
      end

      return true
      -- 是幻方!
    end

    local square = {}
    square[1] = {[1] = 16, [2] = 3,  [3] = 2,  [4] = 13}
    square[2] = {[1] = 5,  [2] = 10, [3] = 11, [4] = 8}
    square[3] = {[1] = 9,  [2] = 6,  [3] = 7,  [4] = 12}
    square[4] = {[1] = 4,  [2] = 15, [3] = 14, [4] = 1}

    local check_for = 34

    print(checkTheSquare(square, check_for) == true)

与您自己的代码相比,它看起来更复杂,但:

1.你的不是算法,而是一种过程。 2.我的是动态的。人们也可以在正方形领域中添加随机值,有趣的是需要多少次尝试才能提供一个幻方。

2014-10-21 07:49:35