【问题标题】:Fill the Grid with three colors A and B and C用三种颜色 A 和 B 和 C 填充网格
【发布时间】:2018-07-16 21:07:16
【问题描述】:

如何找到填充网格 (3*n) 数组的方法数,用 A、B 和 C 三种颜色填充。

在以下限制条件下:

1) All the n cells of the same row can't have the same color.

2)All the 3 cells of the same column can't have the same color.

示例输入:如果 n=2,则输出或路数 = 174。

请解释一下这个方法。

【问题讨论】:

  • 你试过 n=1 吗?我没有计算 n=2,但我认为结果不是 174。
  • 我遇到了这个问题,当我出现在 Codenation 的技术轮中并且 n=2 时,输出为 174 ,如示例案例中所示
  • @Ante 你能为上述更新的问题提供解决方案吗?
  • @Enigma 这是math.stackexchange.com 的问题。用inclusion-exclusion principle解决。

标签: c++ algorithm matrix dynamic-programming combinatorics


【解决方案1】:

这是一个组合问题,当然最好在math.stackexchange.com上发布这样的问题。

一行可以有两种不同的配置:两种颜色 (ABA) 和三种颜色 (ABC)。如果我们有一些配置的最后一行,让我们检查下一行的可能性。

A | B B B C C
B | A A C A A
A | B C B B C

A | B B B C
B | A C C A
C | B A B B

设置:

  • A_n : n 维矩阵的数量,其中最后一行是 ABA 配置,
  • C_n : n 维矩阵的数量,其中最后一行是 ABC 配置,
  • X_n : 维数 n 矩阵 = A_n + C_n。

从它持有的可能下一行的上列表:

A_n = 3 * A_(n-1) + 2 * C_(n-1) = 2 * X_(n-1) + A_(n-1)
C_n = 2 * A_(n-1) + 2 * C_(n-1) = 2 * X_(n-1)
=>
X_n = 4 * X_(n-1) + A_(n-1)

问题的结果是X_n,需要计算A_n,初始值为A_1=6,X_1=12。

更新:

OEIS 中搜索值 2、9、41、187(如果颜色不重要,则使用上序列,实数除以 6),生成序列 A020698。序列提到了类似的问题,并建议可以用更简单的方式来说明上层递归:

X_n = 4 * X_(n-1) + A_(n-1)
    = 4 * X_(n-1) + A_(n-1) + X_(n-1) - X_(n-1)
    = 5 * X_(n-1) + 2 * X_(n-2) + A_(n-2) - 4 * X_(n-2) - A_(n-2)
    = 5 * X_(n-1) - 2 * X_(n-2)

【讨论】:

  • 你能证明 n=2 的 output=174 吗?
  • @LoveBabbar 如果我的程序很好,那么结果是 54。对于 n=1,结果是 12,所以对于 n=2,结果最多可以是 12^2=144。结果不可能是 174。
  • 这是 100% 确定 n=2 的答案是 174。你读过约束吗?
  • @LoveBabbar 你自己检查了吗? 174 种组合并不难检查。特别是由于颜色之间存在对称性,并且通过固定颜色,要检查的组合数量减少了 6 倍。
【解决方案2】:

这个答案由 sam29 在 codefores 上给出。

我们可以使用包含-排除原则来解决这个问题。所以,让我们首先只考虑矩阵的第一列。我们可以很容易地推断出有 24 种不同的方式来填充该列,记住我们不能在完整的列中使用相同的字母。现在,我们可以直接说填充完整矩阵的总方法将是 24^N(将此值命名为 X1)。在这个答案中,我们确保所有列都包含不同的字母。但是我们需要考虑一行包含相同字母的情况。所以,现在我们将使用包含-排除原则。

找出一行相同的案例数。修复第一行中的“A”。现在,只取第一列,你可以推断出有 8 种不同的方法来填充第一列的第二行和第三行,记住我们不能在完整的列中使用相同的字母。所以,现在我们可以找到填充所有 N 行的方法总数为 8^N。现在,我们可以对第一行的“B”和“C”做同样的事情,同样,我们可以对第二行和第三行重复这个过程。因此,总路数将是 9*8^N(将此值命名为 X2)。

找出两行相同的事例数(将此值命名为 X3)。这是问题中最棘手的部分。最后我会解释的。

找出所有三行相同但我们不能在单列中包含相同字母的案例数。这非常简单,相当于填充单列和 3 行的方法数。所以,这个场景的答案是 24(将此值命名为 X4)。

现在,最终答案将是 X1-X2+X3-X4。

现在,回到第二个场景的答案。因此,我们将尝试在第一行和第二行相同的情况下找到答案,并且我们可以对第二行和第三行以及第一行和第三行重复该过程。基本上,我们可以将我们现在计算的答案乘以 3。好的,现在只取第一列。现在,您可以看到将有两种情况,一种是当第一行和第二行包含相同的字母时,在这种情况下,我们必须在第三行放置不同的字母,否则我们将违反我们的条件不同的列。因此,第一种情况下的方式总数将是 3*2^N(我已经跳过了一些部分,但我已经提供了确切的原因和进一步的思考,你会得到解决方案)。现在,对于下一个场景,第一行和第二行包含不同的字母。在这种情况下,您可以在第三行放置任何字母。再试着多想一点,你会得到 6*3^N 的答案。因此,总答案将是 3*2^N + 6*3^N。正如我之前所说,我们需要将它乘以 3(从 3 行中选择 2 行的方法数)。所以,X3 将是 3*(3*2^N + 6*3^N)。

复杂度很直接,你可以做预计算或者每次都应用指数函数。

谢谢。

【讨论】:

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