基本上我有一个3 x 3网格,其中填充了两位数字00-99。其中一些数字作为输入给出,其余数字未知。关于如何在C中用暴力解决这个问题有什么建议?
编辑:抱歉,我忘记了部分问题。每行,每列和对角线必须加起来相同的数字。我不希望任何代码只是一些想法开始使用算法
答案 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.length
和a[r].length
都可以是3的常量(在您的情况下)。
答案 4 :(得分:0)
魔法问题的蛮力非常简单。
如果sum与你在任何点计算的第一个总和不一样,那么你就完成了。如果所有金额相等,那么你就找到了魔方。