Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何递归找到适合的俄罗斯方块的最大数量_List_Haskell_Recursion - Fatal编程技术网

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

List 如何递归找到适合的俄罗斯方块的最大数量,list,haskell,recursion,List,Haskell,Recursion,我正在练习用俄罗斯方块瓷砖铺厨房。基本上,我有一定数量的俄罗斯方块形状的瓷砖,我想找到一个给定尺寸的地板上可以容纳的最大数量 我已经有很多有用的函数,包括计算网格上瓷砖的所有可能位置,给定瓷砖是否可以放置,等等 不过,我不知道如何编写主函数。我应该如何在瓷砖中递归 我的一个想法是用它来获得所有的瓷砖组合,然后看看它们是否都合适。然后我就找到了最合适的名单。还有其他(更好的)方法吗 更新: 关于这类问题有很多文献。除了“俄罗斯方块包装问题”,您还可以找到搜索“Polymino包装”的有用结果 特

我正在练习用俄罗斯方块瓷砖铺厨房。基本上,我有一定数量的俄罗斯方块形状的瓷砖,我想找到一个给定尺寸的地板上可以容纳的最大数量

我已经有很多有用的函数,包括计算网格上瓷砖的所有可能位置,给定瓷砖是否可以放置,等等

不过,我不知道如何编写主函数。我应该如何在瓷砖中递归

我的一个想法是用它来获得所有的瓷砖组合,然后看看它们是否都合适。然后我就找到了最合适的名单。还有其他(更好的)方法吗

更新:

关于这类问题有很多文献。除了“俄罗斯方块包装问题”,您还可以找到搜索“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
等。如果遇到这种情况,您希望找到一种方法来删减搜索

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

以下是暴力算法的概述:

  • 网格中的每个空间都可以由一块或多块空间占据 “空白”区域
  • 跟踪当前网格、剩余碎片和 迄今为止最好的解决方案
  • 如果网格中没有更多可用空间,请返回 这是迄今为止最好的解决方案
  • 如果没有更多的碎片,返回到目前为止最好的解决方案
  • 选择一些可用的网格正方形。考虑所有可能的方法 用一块或一块“空白”填充那个正方形。对于每一个 可能的方法是,通过递归找到最佳解决方案

  • 子序列方法是可行的,但是我的代码太慢了:(你会怎么做?我只是推了我的解决方案。啊,这类问题通常很难解决(就像计算难一样).所以我不希望任何解决方案能在大范围内有效工作。嗯..他们这里有一个参考解决方案:-他们有测试用例。我大约有一半超时。可能是这样。我的意思是,一般的细分问题很难解决。可能选择的形状和形状数允许一个简单的算法找到最佳细分但是对于一般形状,你不能做得比生成和测试更好,而且细分的数量是指数级的。