【问题标题】:Number of ways to fill a nxm grid填充 nxm 网格的方法数
【发布时间】:2013-11-04 02:26:16
【问题描述】:

我在我的编程书中遇到了以下我无法解决的问题:

给定一个 nxm 网格,编写一个递归算法来计算该网格可以被 3x1 和 1x3 块填充的方式数。

我对 3 x M 网格的逻辑:

找出可用于填充网格 M 侧的块组合数。

我不知道如何改变逻辑来解决上面的问题。

有人可以建议吗?谢谢。

【问题讨论】:

  • 你已经尝试过什么,你在哪里卡住了?这是一个相当困难的问题,有很多小尴尬的情况。一个好的彻底的答案可能会非常长;因此,您需要指明受访者应该包括哪些内容,以及他们可以安全地省略哪些内容。
  • 其实写一个算法很容易。它没有要求高效的实现,而 OP 的计数方法可能会更好。

标签: java algorithm recursion combinations


【解决方案1】:

position 成为左上角,然后是网格的第一个未填充的位置(从左到右然后从上到下)。最多有两种方法可以在postion 放置块。尝试在position 放置一个 1x3 水平块,然后在剩余的网格上调用递归函数。尝试在position 放置一个 3x1 垂直块,并在其上调用递归函数。请注意,如果没有合法的方法来放置一个块(例如,最后,假设只剩下一个 2x2 的正方形),程序的这个分支就找不到解决方案。那是因为网格必须由 3x1 块填充。

您的逻辑不是递归的——它是一种组合方法,试图计数。但只要网格不是很大,计算机就有足够的内存来实际尝试所有组合。如果你能将这种方法与书中递归解决的其他问题联系起来,那就太好了。

这是方法签名的一个想法

int blockFillings(boolean[][] grid, int posx, int posy)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多