List 如何递归找到适合的俄罗斯方块的最大数量
我正在练习用俄罗斯方块瓷砖铺厨房。基本上,我有一定数量的俄罗斯方块形状的瓷砖,我想找到一个给定尺寸的地板上可以容纳的最大数量 我已经有很多有用的函数,包括计算网格上瓷砖的所有可能位置,给定瓷砖是否可以放置,等等 不过,我不知道如何编写主函数。我应该如何在瓷砖中递归 我的一个想法是用它来获得所有的瓷砖组合,然后看看它们是否都合适。然后我就找到了最合适的名单。还有其他(更好的)方法吗 更新: 关于这类问题有很多文献。除了“俄罗斯方块包装问题”,您还可以找到搜索“Polymino包装”的有用结果 特别是,本文可能非常有用:List 如何递归找到适合的俄罗斯方块的最大数量,list,haskell,recursion,List,Haskell,Recursion,我正在练习用俄罗斯方块瓷砖铺厨房。基本上,我有一定数量的俄罗斯方块形状的瓷砖,我想找到一个给定尺寸的地板上可以容纳的最大数量 我已经有很多有用的函数,包括计算网格上瓷砖的所有可能位置,给定瓷砖是否可以放置,等等 不过,我不知道如何编写主函数。我应该如何在瓷砖中递归 我的一个想法是用它来获得所有的瓷砖组合,然后看看它们是否都合适。然后我就找到了最合适的名单。还有其他(更好的)方法吗 更新: 关于这类问题有很多文献。除了“俄罗斯方块包装问题”,您还可以找到搜索“Polymino包装”的有用结果 特
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
。
假设您的磁贴集是aabbcdd
,放置aabb
后,网格被填满maxTiles
仍将调用placeAllTiles
和aabc
以及aabcc
和aabcd
等。如果遇到这种情况,您希望找到一种方法来删减搜索
如果没有办法提高分数,你也应该删减。一般来说,这意味着您将不得不使用一种搜索算法来跟踪当前的最佳解决方案,并剪掉不会产生结果的搜索路径
以下是暴力算法的概述:
子序列方法是可行的,但是我的代码太慢了:(你会怎么做?我只是推了我的解决方案。啊,这类问题通常很难解决(就像计算难一样).所以我不希望任何解决方案能在大范围内有效工作。嗯..他们这里有一个参考解决方案:-他们有测试用例。我大约有一半超时。可能是这样。我的意思是,一般的细分问题很难解决。可能选择的形状和形状数允许一个简单的算法找到最佳细分但是对于一般形状,你不能做得比生成和测试更好,而且细分的数量是指数级的。