将一组圆圈分成2个等于一半的线

时间:2018-04-25 17:25:29

标签: algorithm geometry

我几个月来一直试图回答这个问题,但我仍然被困住了。

这个问题要求我编写一个程序来输出YES或NO,以确定给定的集合是否有可以划分它的行。

我正在寻找一种可能的算法来确定答案,一旦我牢牢掌握了答案,我想将其解释为代码。

给定2D平面上的偶数长度圆圈,保证不接触。确定是否可以通过集合绘制一条线,将其精确地分成两部分而不与任何圆相交。

  • 圆半径大于零
  • 没有圆圈接触或包含彼此
  • 总是可以使用一组长度为
  • 每个圆圈的大小可以是唯一的

输入格式:

N - number of circles in set
x y r - N lines of: x coordinate, y coordinate, radius
Input repeats until EOF

为每个测试用例输出YES或NO

示例输入:

4
0 0 20
0 40 20
0 30 10
40 -30 10
4
0 0 20
0 40 20
20 40 20
20 -40 20

输出:

YES
NO

编辑:我尝试解决

首次尝试是找到所有可以解决此问题的行,如果每个圆都是零半径点,则为我提供一组可能的问题解决方案。

链接到Dividing a plane of points into two equal halves

之后我会返回半径,然后遍历每个可能的解决方案。

这个算法非常慢(由于需要在一秒的合理时间范围内运行所需的算法,因此我无需计算O时间)

我的第二次尝试是将这些圆圈投影到y和x轴上并旋转该组,直到存在x轴或y轴的一部分而没有"阴影"将这些集合分成两个时的任何圆圈。

这种方法只需要最大1 / 2pi弧度的旋转来确定答案,但尝试编程是复杂而缓慢的。

我无法在网上找到这个问题,因为它是去年由我大学教授创建的。

1 个答案:

答案 0 :(得分:1)

具有立方复杂度的简单算法:

查找所有圆对的公共切线。有4*n*(n-1)/2 ~ n^2切线。

对于每个切线检查它是否与所有圆相交。 n*n^2=n^3次操作

我认为可能存在复杂度更高的算法(基于切线方向排序)