斯卡拉 - 摩天大楼的谜题

时间:2013-10-13 12:18:58

标签: algorithm scala puzzle

我有一个任务,我应该在任何给定的NxN中解决摩天大楼之谜(http://www.brainbashers.com/skyscrapershelp.asp)。我试图制作一个蛮力的解决方案,但是因为我已经运行它,它似乎不会很快完成(现在已经运行了一个小时而没有电路板的最后一个单元更新过去& #34; 1&#34)。我一直在寻找能够以更有效的方式解决难题的算法,但我真的不明白它是如何工作的。我已经设置了一个程序来管理:

1)测试具有谜题大小值的提示(例如5x5谜题中的5),这意味着相邻行必须从提示旁边的字段中的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 个答案:

答案 0 :(得分:2)

这是一种可行的方法:

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种组合来找到有效的组合。您还需要验证每列是否包含每个数字。