这道题一直没人写题解,那我就来造福一波后人吧
思路比较简单,枚举圆心(x,y),然后枚举半径r,判断一下这三个参数生成的圆经过的方格涂黑的百分比。如果百分比符合条件,那么认为这个圆是存在的。
如果直接枚举每个方格,再计算它与圆心的距离,所需要的代价非常大,注意到w和h的取值是小于100的,所以最大的圆半径为50。
首先使用init()函数预处理出当圆心为(0,0)时,圆所经过的方格相对坐标,用一个vector存储。判断圆弧是否经过方格,我们采用以下策略:
①如果这个方格的中心到圆心的距离与半径的差小于0.5,那么我们认为这个方格的内切圆被圆弧穿过,即方格被圆弧穿过
②如果这个方格的四个顶点中有部分位于圆内,一部分位于圆外,那么我们认为这个方格被圆弧穿过。
以上两个策略也许不能完美地计算出所有的方格,但是它形成的误差是非常小的,并且只会少数格子,而不会多数。但是由于误差仍旧存在,所以虽然题目中保证了黑点只有最多2%变成白点,我们还是得把这个误差扩大一些,我这里扩大到了5%
在后续枚举x,y,r 判断该圆是否存在的时候,我用了一个小技巧来加速判断的完成:一旦有超过5%的点被判定为是白点,那么认为这组 x,y,r不存在相应的圆,直接break。
题目要求了以字典输出,所以最后需要进行排序
代码如下