通过在N个顺时针点形成三角形来查找配置总数

时间:2012-08-02 19:29:30

标签: math geometry combinations

在顺时针方向的圆圈中有固定的N点,编号为1到N. 我们想通过选择任意三个点来创建三角形。

我们可以创建尽可能多的三角形,但没有两个三角形应该相互交叉,一个点只能共享一个三角形。那么有多少这样的配置可能?

例如,让我们有10点:

  • 点1,2,3可以创建一个三角形,如果只有这个三角形,它将是一个配置。
  • 只有三角形(2,3,4)才是其他配置。
  • 三角形(1,2,3)和(4,5,6)将形成其他配置。
  • (2,4,5)也可以是三角形
  • (2,4,5)和(1,3,6)不能是一个配置,因为两个圆圈会相互交叉。

我可以部分解决:

  • 对于一个三角形,我们可以用nC3方式选择任意三个点并创建一个三角形。
  • 对于两个三角形,我们可以用nC6方式选择任意六个点,并且可以用3种方式形成两个三角形

我无法解决更多的三角形。

1 个答案:

答案 0 :(得分:2)

出于以下考虑,我想将“完全没有三角形”视为有效配置。你可以在最后减去一个来摆脱它。

所以递归地想一想。给定 n 点,你有两个选择:你选择“完全没有三角形”并返回,或者你选择三个点来形成一个三角形,然后递归。如果您有三个角,他们会将您的圆圈分成三个范围。所有后续三角形必须具有来自单个范围的角,否则它们将重叠。如果将它们限制为其中一个范围,它们将不会与您的第一个三角形相交。对于递归,您可以将这些范围中的每一个视为一个小圆圈(检查有关交叉点的语句在那里是否仍然有效)。

好的,上面将生成所有可能的有序三角形序列。如果你不关心订单,你必须以某种方式消除它。一种可能性是将每个计数除以 n!,其中 n 是最终生成的三角形数。另一种方法是修复三角形的完整顺序(即按最小角点索引排序),并确保递归永远不会生成比之前选择的三角形更小的三角形。

通过这些想法,您应该能够编写一个小脚本来枚举几个点的三角形配置。您甚至可以手动检查几个案例。也许有这个脚本就足够了。如果没有,您可以将该序列(有或没有由于“完全没有三角形”的偏移量)提供给the On-Line Encyclopedia of Integer Sequences™并查看它们是否有适合您的公式。或者自己找一个,可能是generating function的帮助。如果其他一切都失败了,您可能希望将其带到Math SE

修改
除非我在实现自己的小脚本时犯了错误,否则你要求的序列,包括“完全没有三角形”的实例,是OEIS A071879。还有一个公式。我使用以下python代码生成了该序列:

c = [1, 1, 1]
for n in range(3, 30):
    s = 1
    for i1 in range(0, n - 2):
        for i2 in range(i1 + 1, n - 1):
            for i3 in range(i2 + 1, n):
                s += c[i2 - i1 - 1]*c[i3 - i2 - 1]*c[n - i3 - 1]
    assert len(c) == n
    c.append(s)
    print(s)