数据结构和算法(图形相关)

时间:2016-12-04 03:16:17

标签: algorithm data-structures graph

你会得到一组N支,它们在一些配置中彼此叠加。每个棒由其两个端点指定;每个端点都是一个有序的三元组,给出了它的x,y和z坐标;没有棍子垂直。只有在棍子顶部没有棍子时才可以拿起棍子。

一个。解释如何编写一个带有两支a和b的例程,并报告a是高于,低于还是与b无关。 (这与图论无关。)

  • 计算x和y轴上两根木棍的范围。
  • 如果a和b的x范围或a和b的y范围的交点为零,则两根棍子不在同一个地方。

  • 如果两者都不为零,则计算两根木棍交叉的点(xy平面中两条线的交点),此时具有较高z值的木棒位于顶部。

湾给出一个算法,确定是否可以拾取所有的棒,如果是这样,提供一系列棒拾取器来实现这一点。

我不知道应该使用什么算法。

  • 问题A,如果不正确或是否有问题,请告诉我。

  • 问题B的
  • ,请告诉我哪种算法合适。

1 个答案:

答案 0 :(得分:0)

让我们说可以拿起所有的棍子。

如果你知道一根棍子是否在另一根棍子上面(正如你所描述的那样,通过比较x-y然后是z),那么你有一种比较方法来比较它们之间的棍棒,你可以排序它们。一旦他们进行了排序,你从顶部的那个开始并将其删除,然后取下一个并将其删除......

这里的问题是我们不知道上述情况是否可行。知道上面的算法会给你一个提示:当我们不能对所有的棍子进行分类时,我们就无法删除所有的棍子,即如果我们有循环,例如a< b< c<一个。

因此,您需要找出您的订购方法传递。传递意味着如果一个< b和b<然后a< c,为你所有的棍棒。

如果您的订购方法是可传递的,那么您可以删除所有的棒。如果不是,那么你就无法移除所有的棍棒。

为此,您可以使用冒泡排序算法手动对小节进行排序:

每根棍子:

  • 直接穿过有序的棍子阵列,直到找到一个优越的棍子。
  • 记住索引,但仍然会通过数组的其余部分来检查所有后续的指针是否低于
  • 如果他们不是,请停止,因为您的订单不具有传递性。

这具有O(n ^ 2)复杂度。我不知道你能不能做得更好。