1453. 圓形靶內的最大飛鏢數量
牆壁上掛著乙個圓形的飛鏢靶。現在請你蒙著眼睛向靶上投擲飛鏢。資料規模:點的個數n<=100,r<=5000投擲到牆上的飛鏢用二維平面上的點座標陣列表示。飛鏢靶的半徑為 r 。
請返回能夠落在 任意 半徑為 r 的圓形靶內或靶上的最大飛鏢數。
對題目進行解析,就是要找乙個圓心,使得以該圓心為中心、r為半徑的圓能夠覆蓋(在圓內或者圓上)更多的給定的點。求能覆蓋的最多的點的數目。
由於圓心是在二維座標平面,是無限可能的,所以不能直接用暴力的方法。
換一種思路,如果找到這個圓(這個圓能覆蓋最多的點),那麼一定滿足至少有兩個點在這個圓上。用反證法可以證明:
如果有0個點在這個圓上,可以通過移動圓心,使得有1個點在圓上,並且被覆蓋的點不會變少。
如果有1個點在這個圓上,可以通過移動圓心,使得有2個點在圓上,並且被覆蓋的點不會變少。可以通過固定這個點在圓上,然後進行旋轉。
所以遍歷兩兩的點,找到他們的圓心,求這個圓心覆蓋的點的個數。
從圓上兩個點找到圓心的公式是:
實現**如下:
class solution
double a=dist/2;
double h=math.sqrt(r*r-a*a);
double om=new double;
double mc=new double;
double factor=h/getdist(mc,new double);
mc[0]*=factor;
mc[1]*=factor;
return new double;
}private double getdist(double p1,double p2)
}
還有另一種叫做angular sweep的演算法,以後有空再看看。
參考:關於為什麼一定會有兩個點在圓上
angular sweep
angular sweep
求取圓形區域內的平均灰度值
include include using namespace cv using namespace std const int kvalue 15 雙邊濾波鄰域大小 const double pi 3.14 圓周率 int graylevel mat image,mat dst,point cen...
求取圓形區域內的平均灰度值
include include using namespace cv using namespace std const int kvalue 雙邊濾波鄰域大小 const double pi 3.14 圓周率 int graylevel mat image,mat dst,point cen,in...
求取圓形區域內的平均灰度值
include include using namespace cv using namespace std const int kvalue 15 雙邊濾波鄰域大小 const double pi 3.14 圓周率 int graylevel mat image,mat dst,point cen...