3

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

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

4

5 回答 5

4

您的问题有一个简单的递归解决方案,这是一种称为回溯的蛮力示例(google that)。

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

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

只需给您几行代码,这将更容易描述,但您说您不想要那样。

于 2011-02-08T00:10:58.163 回答
4

幻方实际上是(简单)联立方程组。您可以通过转换为矩阵并使用高斯消除来解决这些问题,这是蛮力但同时也相当优雅。如果解决方案不是唯一的,那么您至少会减少对解决方案的限制,这应该会使解决方案变得更加简单。

于 2011-02-08T14:45:27.043 回答
1

你有什么问题?您是否试图找出每个数字是什么?数字必须满足他们的任何标准吗?如果是这样,只需猜测每个可能的数字??点直到组合符合标准。

于 2011-02-07T23:13:54.983 回答
0

3x3 网格听起来像一个二维数组。

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.length并且a[r].length都可以是 3 的常量(在您的情况下)。

于 2011-02-07T23:18:16.210 回答
0

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

  1. 遍历每一行并计算每一行的总和(保持 i 不变,j++)(3 个总和)
  2. 遍历每一列并计算每一列的总和(保持 j 不变,i++)(3 个总和)
  3. 迭代两条对角线并计算总和(i++,j++,使得 i 等于 j)(2 个总和)

如果总和与您在任何时候计算的第一个总和不同,那么您就完成了。如果所有的和都相等,那么你就找到了魔方。

于 2011-02-07T23:30:09.867 回答