在Python中计算三角形结构问题的最大距离

calculating maximal distance for triangle structure problem in Python

提问人:slartibartfast 提问时间:9/25/2023 更新时间:9/25/2023 访问量:46

问:

我写了一个程序 5hat 输出单个可能的三角形或可能的三角形组合可以到达的最大距离。它适用于我尝试过的所有情况,只有一种情况。

我有一个格式为“3 50 40 30”的输入文件。一行正整数。第一个整数是使用的三角形段数 - 在本例中为“3”。以下按降序排序的整数表示三角形段的长度。我的程序输出单个可能的三角形或可能的三角形组合可以到达的最大距离(对如何构建三角形结构有一些要求,例如 2 个三角形可以共享一个部分,一个三角形的一段必须连接到另一个三角形的角,它们可以以任何角度旋转并重叠, ...,但恕我直言,这里是次要的)。对于示例输入,计算结果为“40”。 它适用于我尝试过的所有输入,但是:“7 42 40 32 30 25 18 15”。预期结果为“66.9495287”;下面的代码计算错误“39.9482860”。

这是我的代码:

import sys
import itertools
import numpy as np

def max_distance(n, lengths):
    max_dist = 0.0
    permutations = np.array(list(itertools.permutations(lengths)))

    for i in range(len(permutations)):
        perm = permutations[i]
        sides = np.array([perm[i:i+3] for i in range(n-2)])
        valid_triangles = sides[:, 0] < sides[:, 1] + sides[:, 2]
        valid_sides = sides[valid_triangles]

        for side in valid_sides:
            a, b, c = side
            s = (a + b + c) / 2
            area_squared = s * (s - a) * (s - b) * (s - c)

            # Ensure area_squared is positive before calculating height
            if area_squared > 0:
                height = 2 * np.sqrt(area_squared) / a
                max_dist = max(max_dist, height)

    if max_dist.is_integer():
        return str(int(max_dist))
    else:
        return format(max_dist, '.7f')

if __name__ == "__main__":
    input_data = sys.stdin.readline().strip().split()
    n = int(input_data[0])
    lengths = [int(x) for x in input_data[1:]]
   
    result = max_distance(n, lengths)
    print(result)

基本上,它定义了一个函数max_distance,用于计算给定长度集中三个点之间的最大距离。max_distance 采用两个参数:n(长度数)和长度列表。它使用 itertools.permutations 生成长度的所有可能排列,并将它们转换为 NumPy 数组。然后,它会遍历每个排列,并检查它是否形成一个有效的三角形。对于每个有效的三角形,它使用 Heron 公式计算面积并检查面积是否为正。如果面积为正,则计算三角形的高度,并在必要时更新max_dist。最后,它检查max_dist是否为整数,并将其作为字符串或格式化的浮点表示形式返回。

我知道这是未经优化的,不是漂亮的代码 - 我只是看不出这里出了什么问题。任何指标都非常受欢迎。

python-3.x 麻木 python-itertools

评论

0赞 Chrysophylaxs 9/26/2023
您能详细说明为什么应该是正确的答案吗?您的代码和解释表明,这是您可以使用从给定边长构建的三角形生成的最大高度。直觉上,当三角形的底最小 (),而其他两条边长尽可能大 () 时,就会发生这种情况。有了这种配置,确实是正确的(我认为)!对我来说,你可以产生一个大于任何边长的三角形高度是没有意义的。注意:。。。66.94...max_dista=15b, c = 42, 4039.94866.94... > 42
0赞 Chrysophylaxs 9/26/2023
旁注:你确定合适吗?该行表示列 0 始终包含最大值,但生成的元组与原始输入的顺序不符。也许更明智。itertools.permutationsvalid_triangles = sides[:, 0] < sides[:, 1] + sides[:, 2]permutationsitertools.combinations(lengths, 3)
1赞 slartibartfast 9/26/2023
感谢您的评论 - 高度可以更高,因为可以将额外的三角形“添加”到一个三角形以创建一些结构。类似于使用任何长度的棍子建造基于三角形的桥梁。是的,“66.xxx”结果被给出来检查。
1赞 slartibartfast 9/26/2023
是的,itertools.permutation 对从第 0 列开始的降序值进行操作。是的,我知道,外循环和 numpy 会:)......但就目前而言,我的大脑在移动这个东西,在这里写作和回答似乎有助于反思。
1赞 slartibartfast 9/26/2023
神圣的葡萄糖!:)从头再来!谢谢。

答: 暂无答案