【发布时间】:2015-11-01 16:38:57
【问题描述】:
这是一个基于Tetris 的谜题。在这个谜题中,我们给出了接下来 n 块将从顶部掉下来的序列。我们的工作是在 GameOver 之前最大化分数。对于一般俄罗斯方块,没有已知的多项式时间算法,但在这个谜题中,只允许使用 I(直)四联骨牌。虽然不允许旋转它们。
以下是限制条件:
- 电路板是一个宽 x 高的矩形
- 我们得到了下 n 个四联骨牌的序列
- 只允许使用四联牌(水平或垂直)
- 不允许件旋转
- 行在填满时被清除
- 董事会最初是空的
- 每清除一行可获得 1 分。
- 当四联骨牌堆叠到比赛场地顶部时,游戏结束。
找出可以获得的最高分。
例子:
8 x 6 板。接下来的7个四联体是[——,|,|,——,|,——,|],其中'——'代表水平四联体,|代表垂直四联体。
在这种情况下,最大可能得分为 3,使用以下策略('.' 代表空棋盘,'#' 代表四联棋子的一部分)。
Initially:
........
........
........
........
........
........
1st move:
........
........
........
........
........
####....
2nd Move:
........
........
.......#
.......#
.......#
####...#
3rd Move:
........
........
......##
......##
......##
####..##
4th Move:
........
........
......##
......##
####..##
####..##
5th Move:
........
........
.....###
.....###
####.###
####.###
6th Move:
........
........
.....###
####.###
####.###
####.###
7th Move:
........
........
....####
########
########
######## // bottom 3 rows are cleared so score is 3
final state:
........
........
........
........
........
....####
即使是我能想出的最佳算法也需要指数级的时间来保存当前板子顶层的状态(即每列的高度)。所以这个算法需要O((H^W)*n)time,因为每一列都有H个高度的可能性。
这可以使用动态规划或一些贪心算法在多项式时间内解决吗?
【问题讨论】:
-
这是你的作业吗?
-
对我来说可能已经晚了:如何从左侧堆叠水平的,从右侧堆叠垂直的?应该在示例中给出三个清除的行,并从贪婪的启发式开始。
-
@Gene。不,我找到了 dp 解决方案,用于更一般的情况,它是 W 上的指数。我想可能会进一步简化并只允许 2 种类型的四联胺我可以在多项式时间内解决它,但我不能。
-
启发式方法可能会奏效,因为问题相对简单。您需要根据板子的大小设计一组规则(例如,如果板子很宽,请将“--”并排放置,如果不是,则将它们堆叠起来)。
-
解决方案是否允许将零件侧向引导到板上由于悬垂而无法从顶部进入的孔中?例如,在一块序列为
||-|||的 5 宽度板上,如果要清除 4 行(而不是1 或 0)。
标签: algorithm dynamic-programming puzzle greedy tetris