《穿越禁区》题目分析
题目大意:给定一个矩形区域,其中有一些圆形雷区。问是否存在一条从左边界移动到右边界的路线,并且中途不经过任何雷区(也不能接触雷区边缘)。起点可选在左边界任意一点,终点可选在右边界任意一点。
例如下图中,上面的情况就没有办法穿越,下面的情况则可以穿越。
我们人脑会有一个很直观的判断,如果雷区没有把左边界和右边界分隔开的话,那么就一定有一条穿越的路线;否则如果左右边界被雷区隔开,那么就一定不存在穿越路线。
问题在于如何把我们脑内直观的判断转化成程序能进行的确定的判断。通过分析我们可以发现:
- 如果两个圆相切或者相交,那么它们的雷区会合并在一起
- 若干个圆连续相切或者相交,会形成一片连通的雷区
- 如果一片连通的雷区同时与上下边界相交或相切,那么这片雷区就会把左右边界分割开来;反之亦然
于是我们可以把原本的几何问题转化成一个图论问题。我们把每一个圆看作一个顶点,同时把上边界看作起点,下边界看作终点。如果两个圆或者圆与边界之间是相交或者相切的,我们就在代表两者的顶点之间连一条边。最后如果存在一条起点到终点的路径,那么就不存在从左到右的穿越路线;反之如果不存在起点到终点的路径,就存在从左到右的穿越路线。
所以第一步我们要做的是建图。这个图一共有N+2个顶点。每对顶点之间我们都要判断是否有边相连,也就是判断圆与圆以及圆与边界是否相交或相切。
这是个简单的计算几何问题。对于圆与圆来说,只需要判断圆心距和半径之和的大小关系;对于圆与边界来说,需要判断圆心到边界的距离和半径的关系,由于边界是平行于X轴的,所以只需要比较Y坐标就能求出圆心到边界的距离。
由于有(N+2)(N+1)/2条边要判断,第一步的复杂度是O(N^2)。
第二步是要判断是否有从起点到终点的路径。这一步我们可以用宽搜、深搜或者并查集来实现,复杂度也是O(N^2)的。
你没有压缩路径,如果树很深,那么会走很多步。