形成三角形

时间:2017-03-13 11:50:28

标签: algorithm geometry

假设给出了一组三角形(每个三角形是一组三个整数,它们是边长)。是否有任何(合理的)算法来检查形状是否可以组合在一起形成一个大三角形?

通过放在一起,我的意思是放在2D平面上   - 没有两个三角形重叠。   - 每个三角形边框的每个部分都与其他三角形的边界重叠,或者形成大三角形的边框。   - 大三角没有空的空间。

对于3-4个三角形,有必要手动测试案例here。有没有办法自动生成这些案例?还有一些情况需要计算角度。是要使用余弦规则来完成还是有更好的方法不需要浮点(因此不精确)计算。

P.S。这不是作业问题;我只是好奇。

2 个答案:

答案 0 :(得分:1)

这听起来像是一个难题。但是你可以做一些检查来证明在给定的一组上是不可能的。大区域(见苍鹭)必须由三面实现,这三面是给定边的总和。角度必须总和为180或360或其中一个角。我相信你可以做更多的测试。如果你不能证明它是不可能的,你可以设置一个适合的边和角度的搜索。

答案 1 :(得分:1)

任何执行此操作的算法都会产生时间复杂度,如n 7 或更糟,因此大量输入始终存在问题。话虽如此,我建议这样的事情:

  • 查找并标记相同的三角形(这样您就不会多次检查相同的解决方案)。
  • 查找并标记等边三角形(这些不必旋转)。
  • 计算每个三角形的角度(这需要两个余弦和两个平方根)。
  • 计算每个三角形的面积(这需要正弦或平方根)。
  • 求和区域以查找大三角形的总面积。

通过这些准备工作,我们仍处于线性时间。但那时:

forming triangles

  • 尝试三角形的每个组合,并将它们的每次旋转作为大三角形的基础。 (红色三角形)
  • 尝试三角形的所有排序,以便没有重叠。
  • 使用此基础和区域的长度来计算大三角形的高度。 (蓝线)
  • 尝试剩余三角形的大于或等于高度的边的每个组合作为第二边。 (绿色三角形)
  • 尝试三角形的所有排序,以便彼此没有重叠,或者与基座中的三角形重叠(角三角形之间的间隙是可以的)。
  • 计算大三角形第三边的长度。
  • 尝试剩余三角形的每个边的组合,以形成大三角形的第三边。 (黄色三角形)
  • 尝试三角形的所有排序,以便彼此没有重叠,或者在基座或第二侧与三角形重叠(角三角形之间的间隙是可以的)。
  • 在大三角形的中间找到剩余空间的角落,并尝试剩余三角形的每个角落组合来填充这些角落。 (蓝色三角形)
  • 如果最后一个剩余三角形适合最后一个剩余空间,那么您已经找到了解决方案。

计算我使用“尝试每一个”字样的次数将让您了解时间复杂度;当然,许多组合将被发现不能在早期工作,因此它所花费的实际时间将在很大程度上取决于具体的输入。