当前位置: 首页 > 知识库问答 >
问题:

砖块在墙上的排列方式总共有多少种?

梁渊
2023-03-14

有一面墙的大小是4xN。我们有无限多块砖,大小分别为4x11x4。砖块在墙上的排列方式总数是多少,这样每次都会出现新的配置?

对于N=1,砖块只能以1格式放置。对于N=7,我们可以铺设砖块的方法之一是

有5种方法可以排列砖块N=7

我使用动态规划来解决这个问题:

static int computeBricks(int n)
{
    if(n <= 3) { return 1; }

    int[] table = new int[n+1];

    table[0] = 1;
    table[1] = 1;
    table[2] = 1;
    table[3] = 1;

    for(int i = 4; i <= n; ++i)
    {
        table[i] = table[i-1] + table[i-4];
    }

    return table[n];
}

但这只是一个组合:猜测直觉。我不完全理解这个解决方案。为什么表[i]=表[i-1]表[i-4]

看起来不是硬币兑换问题吗?

使用n种硬币改变数量的方法数等于:使用除第一种硬币之外的所有硬币改变数量的方法数,加上改变数量的方法数a-d使用所有n种硬币,其中d是第一种硬币的面额。

但我也不明白我们如何用这个想法来解决最初的问题

共有3个答案

蒋弘致
2023-03-14
  f(n) = f(n-1) + f(n-4)  if n >= 4 <p>
  f(n) = 1 if 0  <= n < 4 
江嘉悦
2023-03-14

如果你有少于4列,显然只有一种方法来排列砖块:

1, 12, 123
1, 12, 123
1, 12, 123
1, 12, 123

然而,有两种方法可以为第四根柱子布置砖块
方法1-只需将一列添加到包含3列的正确解决方案中:

1234
1234
1234
1234

方法2-移除现有的三根柱子,放置四个水平砖:

1111
2222
3333
4444

同样的逻辑也适用于所有后续列——你可以选择N-1的所有适当排列,并在每个列中添加一列,或者选择N-4的所有正确排列,并水平放置四块砖
解决方案之所以如此简单,是因为问题的一个推论——你可以放置4块水平砖或4块垂直砖,因为放置1块水平砖将使垂直放置变得不可能,反之亦然
如果墙仍然是4xN,但砖块是2x1和1x2,那么这项任务会困难得多。

曹泉
2023-03-14

完整地说,你可以使用简单的计数技术,不需要算法。

你有N个斑点。有两种方法可以填充这些点:一次一个(垂直砖),或一次填充4个连续点(水平砖)。你可以重新表述:这是你可以在N-(3*K)垂直砖块中放置K一堆4个水平砖块(K介于0和N/4)的方法的数量(对于每一堆4个水平砖块,与1个垂直砖块相比,你会失去3个斑点-这是你[N-4]的位置来自原始算法)。

让我们用一个例子来说明这一点。首先,我在下面使用的符号choose(n,k)是数学组合“n choose k”,即。

现在让我们深入到这个例子中。你能用N=15spot做什么?

>

  • 你有一个K=0水平砖堆(H)和15个垂直砖堆(V):VVVVVVVVVVVV执行此操作的方法的数量是选择(15,0)=1

    或者你可以把K=1H放在某个地方(用1h替换4v会失去三个位置):vvvvv。实现这一点的方法有很多:选择(15-3,1)=选择(12,1)=12

    或者您可以放置K=2H(通过将8 V替换为2 H,您将失去六个点):VVHVVVVVH。这样做的方法的数量是选择(15-6,2)=选择(9,2)=36

    或者你可以把K=3H(用3h替换12v会损失9个点):hvhv。实现这一点的方法有很多:选择(15-9,3)=选择(6,3)=20

    就是这样,你已经达到了水平桩的最大数量(max K=15/4=3)。然后,您只需将所有这些加起来,就可以得到填充这些位置的方法总数:1 12 36 20 = 69

    下面是直接从这个解释中得出的一般公式:

    3601cc2c5.gif" width="100%" height="100%" />

    这最终导致:

  •  类似资料:
    • 本文向大家介绍有一批正方形的砖,排成一个大的正方形,余下32块;如果将它改排成每边长比原来多一块砖的正方形,就要差49块。问这批砖原有多少块?相关面试题,主要包含被问及有一批正方形的砖,排成一个大的正方形,余下32块;如果将它改排成每边长比原来多一块砖的正方形,就要差49块。问这批砖原有多少块?时的应答技巧和注意事项,需要的朋友参考一下 两个正方形用的砖数相差: 32+49=81块, 相邻平方数的

    • 我知道有一种方法可以确定Azure队列(商店帐户)中的邮件数量(或近似数量);但是,有没有办法查询Azure服务总线队列上挂起的消息数?

    • 我有一个包含不同会话标识的消息的servicebus队列。是否有办法获取特定会话ID的消息计数?

    • 我有一个球,我可以在由大小相等的瓷砖组成的地图上移动。玩家应该不能在较暗且有黑色边框的瓷砖上行走。我有一个多维的瓷砖阵列,我用它来检查哪些瓷砖是实心的。 我希望玩家在水平和垂直移动时,可以靠墙滑动。问题是,如果他那样做,他就会固执己见。我设法使它在每个轴上都能完美工作,但是分开的。下面是我的水平碰撞检查代码: level.isBlocked() 方法检查数组的索引是否被实心磁贴占用。i 和 j 变

    • 现在我有了一个,它表示在特定时间板上当前的所有块。 我需要数一下一种类型有多少件,比如白车,黑皇后等,但正常的做法会变得太长,而且看起来很难看。我就是这么做的... 必须有一种更优雅的方法来实现这一点,它需要更少的代码行。我的意思是如果有超过6种类型的碎片和2种类型的颜色。我不能一直像这样给switch语句添加大小写,对吧?但我想不出怎样才能让它更优雅。

    • 看到一个开源的 vue+and 的 demo:https://github.com/creativetimofficial/muse-vue-ant-design-dashboard 看了一下其中的源码 遇到了一些未解的问题 src/views/Sign-Up.vue 里面的 style 模块是空的,其中 scss 相关的定义在 src/scss/pages/_sign-up.scss 我不清楚