2016-04-25 91 views
0

我的工作解决了利用蛮力算法密码锁的方法,但是我跑出来的想法,我怎么能有效地做到这一点。 This image shows how my program is structured.蛮力一个密码锁

这个想法是,该算法应该适用于任何数量的行,每个行可以包含任意数量的列(理由上说,不超过50个总方格)。它应该首先尝试将'2'放入第一个方块,然后在下一个空方块中放置'3',以此类推。如果该方法返回true,则停止。如果没有它重新启动,试图将“3”进入第一方阵,那么在接下来的“3”,...

锁被认为是开放的,当每一行中每平方有正确的数字。该方法然后返回true。它只会在每个可能的序列被尝试时返回false,而且没有任何工作(意味着程序中的其他地方出了问题)。

我们只只考虑第一行,并说,正确的顺序是“3 - 4 - 9”。按照上面的形象,这应该返回true:

//Returns true for a = 0, b = 0, c = 1 --- x = 0, y = 1, z = 2 

allEmptySquares[a][b].putValue(allEmptySquares[a][b].getPossibleSolutions.someArray[c]); 
allEmptySquares[x][y].putValue(allEmptySquares[x][y].getPossibleSolutions.someArray[z]); 

我一直在使用for循环,并使得该方法递归试过,但我不能得到当溶液ž> c将其工作。

有关我应该如何写这个的任何提示?

编辑:我更感兴趣的是你的想法可能的解决方案,而不是你写代码对我来说。

编辑:我忘了提一个很大的细节。对于每个获得新数字的方块,其他方块的替代方法将会减少。想想它像数独。这意味着当someArray.length = 0时,该方法将按照第二段中的说明重新启动。如果所有其他方块都收到了正确的数字,最后一个方块的someArray.length = 1。

编辑:可能的解决方案,并且该方块是预填充的,在程序的其它地方决定,因此,该方法需要将作为“通用”成为可能。

+0

你明白这个问题太大,无法真正解决,对?在“合理范围内”示例中有10^50个解决方案。你应该编写代码来解决一个更简单的问题,比如3位数的锁,然后向我们显示代码。 – markspace

+0

但是你有一个算法 - 你称之为蛮力。你似乎要求的是:“我怎么实现这个算法?” - 这是代码。正如markpace指出的那样,10^50非常大 - 例如,如果您每纳秒检查一个代码,则需要3.16887646×10^33年... – gilleain

+0

另一方面,您已将一些优秀细节放入您的问题,但它仍然有点神秘。为什么从2开始,而不是1?为什么获得可能的解决方案只返回[3,7,9]而不是[1 ... 9]? – gilleain

回答

1

你能适应我用数独的设置,一旦...它仍然是蛮力,而是约束稍微复杂。

基本流程是选择 - 约束 - 标记 - 回溯。首先为第一个“打开”方块分配一个值,(只需要第一个可能的值)。然后,运行约束检查来限制其他方块的所有值。如果它们中的任何一个仅限于单个值,请指定该值,然后重新运行约束添加。如果你发现自己在一个有效的任务中的一切,返回;如果您发现自己有多种选择,请选择一个并重试;如果你发现自己没有任何正方形的有效选择,请回到最后的选择,然后尝试下一个。

(成立“回到”设置最简单的方法是用递归函数调用,因此调用堆栈是相同的搜索栈。)