我有一个任务,我应该在任何给定的nxn中解决摩天大楼难题(http://www.brainbashers.com/skyscrapershelp.asp)。我试着用蛮力解决问题,但自从我运行它之后,它似乎没有很快完成(已经运行了一个小时,但没有更新过“1”的最后一个单元)。我一直在研究算法,以更有效的方式解决这个难题,但我真的不明白它是如何工作的。我已经建立了一个程序,能够:
1)使用字谜大小的值测试提示(例如5x5字谜中的5),这意味着相邻行必须从提示旁边的字段中的1变为1,递增1,直至字谜大小(在前面的示例中为5,即1、2、3、4、5)。
2)使用值1测试提示,这意味着相邻字段必须是拼图的最大大小(在前面的示例中为5)。但在这之后,我真的不知道下一步该怎么做了。我知道如何工作,如果我解决了一个特定大小的难题(如4x4),但问题是开发一个NxN难题我找到这个:Skyscraper puzzle algorithm
但我并不真正理解那里提供的答案。
我还发现了这个:http://www.wikihow.com/Solve-a-Skyscrapers-Puzzle
但这是一个具体的例子,我真的不知道如何把它转换成NxN算法。
我不能发布两个以上的链接,所以我将发布到我的代码的链接(暴力解决方案和我在算法一中所得到的结果)作为对这个问题的评论谢谢你抽出时间!

最佳答案

以下是一种可行的方法:
1)对于网格大小,生成一个包含所有数字排列的数组例如,在4x4中,您将拥有[1234、1243、1324、1342、1423、1432、2134、2143、2314、2341等]
2)然后分别从左右两侧计算可见的摩天大楼。
[[1234,4,1],[1243,3,2],[1324,3,1],…
3)对于拼图的每一行,通过从步骤2中选择与拼图左右两边的数字匹配的行,生成可以工作的摩天大楼列表。
4)所以,现在您可能有1个用于第1行,3个用于第2行,2个用于第3行,2个用于第4行暴力部分来了您需要尝试所有这些组合,并测试它们是否满足顶部和底部的数字在我的例子中,你必须测试1*3*2*2=12个组合才能找到有效的。您还需要验证每个列是否包含每个数字。

关于algorithm - Scala-摩天大楼拼图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19345133/

10-12 04:09