一个有趣的算法题:别惊动魔王?


题目如下:

琼斯博士在寻宝的过程中,来到了一个平面图呈矩形的封闭房间。

矩形的宽度为w,高度为h。为方便描述,我们将矩形左上角坐标定为(0, 0),右下角坐标定为(w, h)。

房间的入口在矩形上沿的中点(即(w/2, 0)),出口在矩形下沿的中点(即(w/2, h))。狡猾的魔王还放置了许多红外探测器,一旦进入探测器的探测半径以内,将触发警报。

现在琼斯博士向您求助,他能否全身而退不惊动魔王?


 输入:boolean escape(int w, int h, int n, double[] x, double[] y, double[] r)

w为矩形宽度,h为矩形高度,n为探测器总数。第i个探测器的坐标为(x[i],y[i]),探测半径为r[i]。


 输出:true or false

编程 算法 面试题

石更不起来君 10 years, 7 months ago

不求最短,只求能走的话,把探测器的边缘当作墙,左手扶墙走,如果走回入口说明是封闭的无法脱出,如果走到出口那就可以走出去

先求所有的直线/圆之间的交点,分别记录下来(四个顶点和入口出口也都记录为交点),然后从入口向左的直线开始找最近的交点,碰到交点就把“当前在走的线”更换,然后循环继续找交点,直到找到入口“交点”返回false,出口“交点”返回true
“最近的交点”的搜索方向,如果当前在走的线是直线(边),那么就是朝内部(上边沿的下面,etc),如果是圆弧,那么就是朝远离圆心的方向

求搜索方向,确定方向后找下一个节点等操作都是o1的,求所有交点虽然是平方级,但是是探测器数量的平方,感觉上应该还比较快

好地地唔得嘅 answered 10 years, 7 months ago

Your Answer