给定3 x N矩形,确定我们可以使用1x3和3x1切片平铺矩形的方式

时间:2011-10-25 07:14:52

标签: algorithm

我该如何解决这个问题?我想我会尝试放置瓷砖,如果我不能再放了,我需要回溯......但我怎么知道要回溯多少?放置瓷砖后,我(代码)如何决定填充下一个瓷砖以及使用哪种瓷砖?

6 个答案:

答案 0 :(得分:10)

使用此重复:F(N) = F(N - 1) + F(N - 3)
基本情况:F(0) = F(1) = F(2) = 1

这里,F(N)表示没有用3X1或1X3瓦片平铺3XN网格的方法。

  • 如果你放置3X1牌,那么你只需要解决F(N - 1)

  • 如果放置1x3瓷砖,则无法放置3x1瓷砖 它。基本上,您将需要放置一组三个1x3瓷砖 在一起,因此你解决F(N - 3)

拿出总和,你得到我上面提到的复发。

希望这会有所帮助:)

答案 1 :(得分:2)

计算机科学问题的第一件事就是理解并减少它。在这种情况下,尝试了解矩形的高度如何与问题相关。将瓷砖放在侧面时,是否有任何选择,但在其下方水平放置两块瓷砖?那么,你有效的瓷砖选择有哪些?它是2D还是一维问题?

然后您应该能够通过组合学解决问题。

答案 2 :(得分:1)

考虑从左到右构建3×N块。在任何阶段,基本上都要考虑两种情况:您可以放置​​一个垂直的瓷砖,也可以放置三个水平的瓷砖。您可以在递归函数中捕获这些函数,该函数尝试两种替代方法并调用自身来构建块的其余部分。也就是说,构建3乘N块的方式的数量是构建3乘(N-1)块的方式的数量加上构建3乘(N-3)块的方式的数量。

由于这是家庭作业,我将把实施留给你。我希望它也可以用手完全解决。

答案 3 :(得分:0)

我认为这可以纯粹使用整数除法和模数以及一些乘法来解决。不需要循环。

答案 4 :(得分:0)

使用dynamic programming实现c ++:

int getCount(int n)
{
    vector<int> f(n + 1);
    f[0] = 1;
    f[1] = 1;
    f[2] = 1;
    for(int i = 3; i <= n; i++)
    {
        f[i] = f[i-1] + f[i-3];
    }
    return f[n];
}

f(n) - 长度为n的解。 f(n-1) - 当你垂直时。 f(n-3) - 当您放置3个水平块时

答案 5 :(得分:0)

想想平铺必须看起来如何 - 有垂直方块或3x3方块水平方块。想象一下,这些3x3块被粘在一起 - 这样做没有损失。如果有k 3x3块,那么k = 0,1,...有n - 3k垂直块。 。 。| N / 3 |其中| j |是小于或等于j的最大整数。存在C(n-2k,k)排列,其中C(x,y)是“n选择y”,即(x!)/((y!)((x-y)!))。所以答案是C(n,0)+ C(n-2,1)+ C(n-4,2)+。 。 .C(n - 2,| n / 3 |)。相同的方法适用于具有nx1个tile的nxk盒的倾斜次数。事实上,使用像3这样的小型挑衅性数字可能会让人分心。要解决此问题,宽度大于n的盒子需要另一次递归。