蛮力魔术方块

时间:2011-02-07 23:10:08

标签: algorithm brute-force magic-square

基本上我有一个3 x 3网格,其中填充了两位数字00-99。其中一些数字作为输入给出,其余数字未知。关于如何在C中用暴力解决这个问题有什么建议?

编辑:抱歉,我忘记了部分问题。每行,每列和对角线必须加起来相同的数字。我不希望任何代码只是一些想法开始使用算法

5 个答案:

答案 0 :(得分:4)

你的问题有一个简单的递归解决方案,这是一种叫做回溯的暴力行为的例子(google that)。

递归函数(比如fill_next)查找具有未知值的下一个单元格。如果没有这样的单元格,它会检查正方形以确定它是否符合要求(总和是否正确),如果是,则打印方块作为解决方案;它然后返回。如果有一个具有未知值的单元格,它会循环,依次为该单元格尝试每个值0到99,然后递归调用自己以填充下一个未知单元格。

如何到达具有未知值的下一个单元格:您可以简单地将find_next传递给下一个要开始查看的单元格的编号;你可以通过调用fill_next(0)来启动整个过程。由于您有9个单元格,因此单元格编号为0到8。如果要将正方形存储在2D数组中,只需使用num%3和num / 3作为索引。

通过仅提供几行代码就可以更容易地描述,但是你说你不希望这样。

答案 1 :(得分:4)

魔术方块实际上是(简单)联立方程组。你通过转换成矩阵并使用Gaussian elimination来解决这些问题,这是一种蛮力但同时又相当优雅。如果解决方案不是唯一的,那么至少可以对解决方案的约束进行一系列限制,这样可以使解决方案变得更加简单。

答案 2 :(得分:1)

你有什么问题?你想知道每个号码是什么吗?他们的数字必须满足的标准是什么?如果是这样,那就猜猜每个可能的数字?直到一个组合符合标准。

答案 3 :(得分:0)

3x3网格听起来像是2d数组。

JS中的一些示例代码:

var a=[
    [ 11, 12, 13 ],
    [ 21, 22, 23 ],
    [ 31, 32, 33 ]
];
for(var r=0; r<a.length; r++)
    for(var c=0; c<a[r].length; c++)
        console.log(r+','+c+' = '+a[r]+','+a[r][c]);

a - 3x3网格数组(数组数组) r - 当前行迭代 c - 当前列迭代

可选地,a.lengtha[r].length都可以是3的常量(在您的情况下)。

答案 4 :(得分:0)

魔法问题的蛮力非常简单。

  1. 迭代每一行并计算每一行的总和(保持不变,j ++)(3总和)
  2. 迭代每列并计算每列的总和(保持j常数,i ++)(3个总和)
  3. 迭代对角线和计算总和(i ++,j ++,使得我等于j)(2个总和)
  4. 如果sum与你在任何点计算的第一个总和不一样,那么你就完成了。如果所有金额相等,那么你就找到了魔方。