我几个月来一直试图回答这个问题,但我仍然被困住了。
这个问题要求我编写一个程序来输出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弧度的旋转来确定答案,但尝试编程是复杂而缓慢的。
我无法在网上找到这个问题,因为它是去年由我大学教授创建的。
答案 0 :(得分:1)
具有立方复杂度的简单算法:
查找所有圆对的公共切线。有4*n*(n-1)/2 ~ n^2
切线。
对于每个切线检查它是否与所有圆相交。 n*n^2=n^3
次操作
我认为可能存在复杂度更高的算法(基于切线方向排序)