基本上我有一个 3 x 3 的网格,其中填充了两位数字 00 - 99。其中一些数字作为输入给出,其余的未知。关于如何在 C 中用蛮力解决这样的问题有什么建议?
编辑:对不起,我忘记了部分问题。每行和每列和对角线必须加起来相同的数字。我不想要任何代码只是一些开始使用算法的想法
基本上我有一个 3 x 3 的网格,其中填充了两位数字 00 - 99。其中一些数字作为输入给出,其余的未知。关于如何在 C 中用蛮力解决这样的问题有什么建议?
编辑:对不起,我忘记了部分问题。每行和每列和对角线必须加起来相同的数字。我不想要任何代码只是一些开始使用算法的想法
您的问题有一个简单的递归解决方案,这是一种称为回溯的蛮力示例(google that)。
递归函数(例如,fill_next)找到下一个具有未知值的单元格。如果没有这样的单元格,它会检查正方形以查看它是否符合要求(总和是否正确),如果是,则打印正方形作为解决方案;然后它返回。如果存在具有未知值的单元格,它会循环,依次尝试该单元格的每个值 0 到 99,然后递归调用自身以填充下一个未知单元格。
如何到达具有未知值的下一个单元格:您可以简单地将下一个单元格的编号传递给 find_next 开始查看;您可以通过调用 fill_next(0) 来开始整个过程。单元格编号为 0 到 8,因为您有 9 个单元格。如果您将正方形存储在二维数组中,只需使用 num%3 和 num/3 作为索引。
只需给您几行代码,这将更容易描述,但您说您不想要那样。
幻方实际上是(简单)联立方程组。您可以通过转换为矩阵并使用高斯消除来解决这些问题,这是蛮力但同时也相当优雅。如果解决方案不是唯一的,那么您至少会减少对解决方案的限制,这应该会使解决方案变得更加简单。
你有什么问题?您是否试图找出每个数字是什么?数字必须满足他们的任何标准吗?如果是这样,只需猜测每个可能的数字??点直到组合符合标准。
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 的常量(在您的情况下)。
魔方问题的蛮力非常简单。
如果总和与您在任何时候计算的第一个总和不同,那么您就完成了。如果所有的和都相等,那么你就找到了魔方。