在顺时针方向的圆圈中有固定的N点,编号为1到N. 我们想通过选择任意三个点来创建三角形。
我们可以创建尽可能多的三角形,但没有两个三角形应该相互交叉,一个点只能共享一个三角形。那么有多少这样的配置可能?
例如,让我们有10点:
我可以部分解决:
我无法解决更多的三角形。
答案 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)