【问题标题】:Fill entire 2D Array (Tetris board) with Tetris pieces, no spaces left over (Java)用俄罗斯方块填充整个二维数组(俄罗斯方块板),没有剩余空间(Java)
【发布时间】:2013-03-07 08:16:16
【问题描述】:

假设我有一个 2D int 数组..

int[][] board = new int[10][20];

public void initBoard()
{
    for(int r = 0; r < 10; r++)
        for(int c = 0; c < 20; c++)
            board[r][c] = 0;
}

0 表示没有一块 棋子用1-7表示;

1 - Z 形

2 - S 形

3 - 线条形状

4 - T 形

5 - 盒子形状

6 - L 形

7 - 倒 L 形

用随机形状填充整个数组并且没有剩余空间的最佳方法是什么。

注意:我的游戏正在运行,我只是在尝试让它适应不同的东西,同时仍在使用俄罗斯方块游戏

【问题讨论】:

  • 定义“最佳”。使用最少的块?这可能包括主要/专门使用具有最多块的形状。有很多很多的选择,一次填2-3行就好了,应该很容易。
  • 最简单/最有效的。没有区块数量要求。我宁愿它每次都使用等量(尽可能多)的每个块。
  • 最简单的就是用盒子形状或者线条形状来填充不是吗?

标签: java arrays 2d fill tetris


【解决方案1】:

这实际上是您要问的一个非常复杂的问题。在计算机科学中,它被称为Packing Problem,并且有许多可能的算法和可能的方法,具体取决于您想要完成的确切性质。

在一般情况下,这个问题很难,真的很难,实际上,找到一个最优的一般解决方案是 NP-hard。欲了解更多信息,请查看Demaine et al from MIT 的研究论文。

【讨论】:

  • 是的,我已经搜索了几个小时并运行了自己的测试,但几乎没有结果。我可能会制作一些预定义的数组来使用。
  • 为了了解您想要做的事情是否可能,您需要更具体地了解确切您要完成的工作。
【解决方案2】:

这并不像看起来那么容易。实际上是NP-hard problemPacking rectangles is similar,你可以从那个简单一点的问题开始。

【讨论】:

  • 在计算机科学方面,没有什么比看起来那么容易了哈哈。是的,我可能只是制作一堆预定义的数组。
  • 是的,您可以尝试“工程师的方法”;) 预定义或只是随机扔块...或两者兼而有之 - 用几块小块制作小矩形,然后将它们随机放置在制作的每个网格单元中来自矩形。
  • 我……没想到。这是个好主意。
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
相关资源
最近更新 更多