如何递归以找到适合的最大数量的俄罗斯方块瓷砖

时间:2015-08-25 15:15:47

标签: list haskell recursion

我正在研究用Tetris瓷砖拼贴厨房的练习问题。基本上我有一定数量的俄罗斯方块形状的瓷砖,我想找到我可以在给定大小的地板上适合的最大数量。

Here's the full problem description

我已经拥有了很多有用的功能,包括计算网格上所有可能的平铺位置,是否可以放置给定的平铺,等等。Here's what I have so far

我无法弄清楚如何编写main函数。我应该如何通过瓷砖递归?

我的一个想法是使用subsequences获取所有瓷砖组合,然后查看它们是否合适。然后我找到最适合的列表。还有什么其他(更好的?)方法呢?

1 个答案:

答案 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仍会使用placeAllTilesA A B B CA 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')" /> 。如果遇到这种情况,你想找到一种方法来修剪搜索。

如果没有办法提高分数,你也应该修剪。一般来说,这意味着您将不得不使用搜索算法来跟踪当前的最佳解决方案并修剪掉不会富有成效的搜索路径。

以下是蛮力算法的概述:

  1. 网格中的每个空间都可以被一块或一块占用 一个“空白”空间。
  2. 跟踪当前网格,剩余的碎片和    到目前为止最好的解决方案。
  3. 如果网格中没有更多可用空格,请返回    到目前为止最好的解决方案。
  4. 如果没有更多碎片,请返回目前为止的最佳解决方案。
  5. 选择一些可用的网格方块。考虑一切可能的方法    用一块或“空白”填充那个正方形。对于每一个    可能的方法,通过递归找到最佳解决方案。