我看到很多小伙伴,都是用生成许多随机数,然后不停的测试来做的。对于本题的数据集来说,也能顺利的通过所有的测试点。甚至有的小伙伴,只用验证四个角部,就能通过所有测试点。我只能说这个测试集实在是做的太宽松了。。。。
生成随机数的方法,固然可以通过测试,但是不能忽略有一个致命的问题,就是如果极端情况下,只有一个非常非常小的小区域可以上网,那么很大可能在规定的时间内找不到解。假定这个小区域的面积,只占总面积的十亿分之一,而在规定的时间内只能生成一亿个随机数。有没有无论运气多糟糕,都能保证能顺利求解的方法呢?
我给大家推荐一个基于求圆之间交点的方法,我就叫做香蕉园法吧。
本题乍一看是无法穷举的,因为正方形中的点有无穷多。但仔细分析以后,其实是可以穷举的。考虑可以上网的区域的边界,应该是圆弧,或者是正方形的边界,那么这个区域一定有若干个特殊的交点。交点有三种:
- 圆和圆的交点,不超过n*(n-1)个
- 圆和正方形的交点,不超过8*n个
- 正方形的角点,4个
而所有可能的交点,其实上是非常有限的。只要把这些交点计算出来并一一验证即可。这个方法可以适用于更大规模的数据集,以及极端的情况。
用勾股定理和简单的解析几何就可以计算出交点,我就不详细介绍了。