我正在研究用Tetris瓷砖拼贴厨房的练习问题。基本上我有一定数量的俄罗斯方块形状的瓷砖,我想找到我可以在给定大小的地板上适合的最大数量。
Here's the full problem description
我已经拥有了很多有用的功能,包括计算网格上所有可能的平铺位置,是否可以放置给定的平铺,等等。Here's what I have so far
我无法弄清楚如何编写main函数。我应该如何通过瓷砖递归?
我的一个想法是使用subsequences
获取所有瓷砖组合,然后查看它们是否合适。然后我找到最适合的列表。还有什么其他(更好的?)方法呢?
答案 0 :(得分:2)
更新
关于这类问题,有很多文献。除了“俄罗斯方块包装问题”,您还可以找到搜索“多米诺骨牌包装”的有用结果。
特别是,这篇文章可能很有用:
原始答案:
我看到的一个问题是你没有足够地修剪你的搜索。
您的主要搜索功能是:
maxTiles :: Grid -> [Tile] -> Int
maxTiles g ts =
let tss = subsequences ts
gs = map (\ts -> placeAllTiles ts g) tss
scores = map (uncurry scoreGrid) $ zip tss gs
in maximum scores
您在磁贴集的所有子序列上调用placeAllTiles
。
假设您的图块集为A A B B C C D D
,并且在放置A A B B
之后网格已填满。 maxTiles
仍会使用placeAllTiles
,A A B B C
和A A B B C C
以及其他人A A B B C C D
致电<span class="image before" style="background-image:url('http://www.abc.net.au/news/linkableblob/5272894/data/view-of-independence-square-in-kiev-data.jpg')" />
<span class="image after" style="background-image:url('http://www.abc.net.au/news/linkableblob/5272868/data/site-of-anti-government-protest-in-kiev-data.jpg')" />
。如果遇到这种情况,你想找到一种方法来修剪搜索。
如果没有办法提高分数,你也应该修剪。一般来说,这意味着您将不得不使用搜索算法来跟踪当前的最佳解决方案并修剪掉不会富有成效的搜索路径。
以下是蛮力算法的概述: