俄罗斯方块拼图的多项式时间解决方案

时间:2015-08-09 19:41:31

标签: algorithm dynamic-programming puzzle greedy tetris

这是一个基于Tetris的谜题。在这个谜题中,我们将获得接下来将从顶部落下的n个片段的序列。我们的工作是在GameOver之前最大化得分。一般的俄罗斯方块没有多项式时间算法,但在这个难题中只允许I(直)四联体。虽然它不允许旋转它们。

所以这是约束:

  • 该板是W x H矩形
  • 我们得到了下一个四联虫的序列
  • 只允许我使用tetromino(水平或垂直)
  • 不允许旋转
  • 当行填满时行被清除
  • 董事会最初是空的
  • 每行清除1分。
  • 当tetrominoes叠加到比赛场地的顶部时,比赛结束了。

找到可以获得的最高分数。

示例:

8 x 6板。接下来的7个tetrominoes是[——,|,|,——,|,——,|],其中'——'代表水平的I tetramino,|代表垂直的I tetramino。

在这种情况下,最高可能得分为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)时间,因为对于每个列,存在高度的H可能性。

这可以使用动态编程或一些贪婪算法在多项式时间内解决吗?

2 个答案:

答案 0 :(得分:1)

我会猜一下:

该板是W x H二进制矩阵。

四联骨牌的序列是长度为n的二进制字符串,1表示垂直,0表示水平。

让我们尝试决策问题:给定一个任意的棋盘和长度为n的四联体的任意序列,是否有一个获胜的移动序列?

在每个步骤中,您最多可以选择W选项:tetronmino的位置。

要检查是否给定一个板和一系列四联骨牌有一个获胜的移动序列检查CanWin(B(n)),使用以下算法:

 CanWin(B(i)):
   if Filled(B(i)) return false
   if (i == n and not Filled(B(i))) return true
   choose position in 0..W-1
   B(i+1) = UpdateBoard(Bi, s(i+1), position)
   return CanWin(B(i+1))

您可以通过查看顶行来检查电路板是否填写了O(W)。您可以通过检查O(H)中的冲突来更新电路板。 [需要考虑行擦除] 然后你可以决定是否在O(nW(H)^ W)中有一个获胜序列。

如果您记得哪个猜测对父指针最好,那么您就有了获胜策略。

现在算法是指数的,但你可以memoized使用大小最多为2 ^(W x H + 1)x W的数据集进行递归。

从现在开始,我不知道如何计算记忆电话的数量。

说明:

  • 在这个版本中,你无法在秋季从顶部引导tetromino。

  • 由于行擦除,递归中可能存在循环。您应该从问题中删除此规则。

  • 文章Tetris is Hard, Even to Approximate推测,只有一个横向/纵向四度的俄罗斯方块是多项式时间。

答案 1 :(得分:0)

我无法理解如何以比指数时间最坏情况更快的速度完成这项任务。一些想法:

游戏结束时:n tetrominoes被放置被放置的tetrominoes高于失败水平。

可以找到比指数时间更快的解决方案 。由于累积点的唯一方法是清除行,并且因为无论一次清除多少行,每行都是1个点,因此可能存在多个解决方案。如果在放置四个tetromino之后没有留在板上的四联骨牌,那么就没有更高的得分解决方案(以更少的动作完成并没有获得奖励积分)。在最好的情况下,解决方案可以在线性时间(地点n tetrominoes)找到,最坏的情况是指数。

我们可以采用明显的技巧或模式来加快速度。例如,如果可以证明x个tetromino可以清除电路板,那么如果x除以n我们就有了解决方案。