你会得到一组N支,它们在一些配置中彼此叠加。每个棒由其两个端点指定;每个端点都是一个有序的三元组,给出了它的x,y和z坐标;没有棍子垂直。只有在棍子顶部没有棍子时才可以拿起棍子。
一个。解释如何编写一个带有两支a和b的例程,并报告a是高于,低于还是与b无关。 (这与图论无关。)
如果a和b的x范围或a和b的y范围的交点为零,则两根棍子不在同一个地方。
如果两者都不为零,则计算两根木棍交叉的点(xy平面中两条线的交点),此时具有较高z值的木棒位于顶部。
湾给出一个算法,确定是否可以拾取所有的棒,如果是这样,提供一系列棒拾取器来实现这一点。
我不知道应该使用什么算法。
问题A,如果不正确或是否有问题,请告诉我。
,请告诉我哪种算法合适。
答案 0 :(得分:0)
让我们说可以拿起所有的棍子。
如果你知道一根棍子是否在另一根棍子上面(正如你所描述的那样,通过比较x-y然后是z),那么你有一种比较方法来比较它们之间的棍棒,你可以排序它们。一旦他们进行了排序,你从顶部的那个开始并将其删除,然后取下一个并将其删除......
这里的问题是我们不知道上述情况是否可行。知道上面的算法会给你一个提示:当我们不能对所有的棍子进行分类时,我们就无法删除所有的棍子,即如果我们不有循环,例如a< b< c<一个。
因此,您需要找出您的订购方法传递。传递意味着如果一个< b和b<然后a< c,为你所有的棍棒。
如果您的订购方法是可传递的,那么您可以删除所有的棒。如果不是,那么你就无法移除所有的棍棒。
为此,您可以使用冒泡排序算法手动对小节进行排序:
每根棍子:
这具有O(n ^ 2)复杂度。我不知道你能不能做得更好。