如何找到填充网格(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。
请解释一下这个方法。
这个答案由sam 29给出了代码强制。
我们可以使用包含 - 排除原则来解决这个问题。所以,我们首先考虑矩阵的第一列。我们可以很容易地推断出有24种不同的方法来填充该列,请记住我们在完整列中不能使用相同的字母。现在,我们可以直接说填充完整矩阵的总方式为24 ^ N(将此值命名为X1)。在这个答案中,我们确保所有列都包含不同的字母表。但我们需要考虑一行包含相同字母的情况。所以,现在我们将使用包含 - 排除原则。
找出一行相同的案例数。修复第一行中的“A”。现在,只取第一列,你可以推断出有8种不同的方法来填充第一列的第2行和第3行,记住我们在完整列中不能有相同的字母。所以,现在我们可以找到将所有N行填充为8 ^ N的总方式。现在,我们可以在第一行中使用“B”和“C”执行相同的操作,同样地,我们可以重复第2行和第3行的过程。因此,总路数将为9 * 8 ^ N(将此值命名为X2)。
查找两行相同的个案数(将此值命名为X3)。这是问题中最棘手的部分。我终于解释一下了。
查找所有三行相同的案例数,但我们不能在一列中使用相同的字母。这非常简单,相当于填充单列和3行的方法数。因此,对于这种情况,答案是24(将此值命名为X4)。
现在,最终的答案将是X1-X2 + X3-X4。
现在,回到第二个场景的答案。因此,当第一行和第二行相同时,我们将尝试找到案例的答案,我们可以为第二行和第三行以及第一行和第三行重复该过程。基本上,我们可以将我们现在计算的答案乘以3.然后,现在只取第一列。现在,您可以看到将有两个场景,一个是第一行和第二行包含相同的字母,在这种情况下,我们必须在第三行放置一个不同的字母,因为否则我们将违反我们的条件不同的列。所以,第一个场景中的总路数将是3 * 2 ^ N(我已经跳过了一些部分,但我已经提供了确切的原因,并进一步思考,你将得到解决方案)。现在,对于第一行和第二行包含不同字母的下一个场景。在这种情况下,您可以在第3行放置任何字母。再试一次思考,你会得到6 * 3 ^ N的答案。因此,总答案为3 * 2 ^ N + 6 * 3 ^ N.正如我之前所说,我们需要将它乘以3(从3行中选择2行的方式数)。因此,X3将是3 *(3 * 2 ^ N + 6 * 3 ^ N)。
复杂性非常直接,您可以每次都进行预计算或应用指数函数。
谢谢。
这是组合问题,肯定最好在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 = 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)