二維點對,先隨機生成平面點,再把平面上的點劃分成左右兩部分,我覺得其實無所謂左右點的多少,對結果沒有影響,記錄最短距離的點,比較中線附近的點的距離。
#include #include #include #include using namespace std;
const double inf = 1e20;//相當於正無窮
const int n =10000;
struct point
point[n];
int tmpt[n];
void setpoints(point point, int num);
float dis(int a, int b);
void paixu1(point l, int num);
double min(double a, double b);
double closest_pair(int left, int right, point &p, point &q);
int main()
void setpoints(point point, int num)
for (int i = 0; i < num; i++) }
//求兩點的距離的平方
float dis(int a, int b)
void paixu1(point l, int num)
} } cout << endl;
for (int i = 0; i < num; i++)
if (left + 1 == right)
return dis(left, right);
int mid = (left + right) /2;
double d1 = closest_pair(left, mid,p,q);//隨著呼叫mid,left right 都在改變
point d1p = p;
point d1q = q;//儲存左支最近兩個點的點資料
double d2 = closest_pair(mid + 1, right,p,q);//得到右支的最短距離點資料
d = min(d1, d2);
if (d1 < d2)
else
int i, j, k = 0;
//分離出寬度為d的區間
for (i = left; i <= right; i++)
sort(tmpt, tmpt + k, cmpy);//排序函式,(首位址,尾位址,排序方式)
for (i = 0; i < k; i++)
}}return d;
}
希望我的**對你的學習有幫助
二維平面最短距離(分治)
題目描述 有一天,小明得到了二維平面上的若干個點,他現在想知道這些點中距離最近的兩個點之間的距離是多少?輸入 第一行輸入乙個整數t,共有t組測試資料 t 30 每組輸入資料第一行輸入乙個n,表示有n個點。第二行有n 2的數字,相鄰兩個數代表乙個點的x,y座標。1輸出輸出有t行,每行包括乙個整數,代表...
28 幾何演算法 點集中最短距離點對的距離
求取輸入點集最近點對的距離 相比於對所有點對窮舉,並得出結果的方式相比,本演算法時間複雜度為 nlg n 優於窮舉下的 n 2 extern c class algorithmlib mindistance class flagpoint mindistance mindistance double...
二維幾何 平面最近點對
存個模板 是用分治寫的時間複雜度 nlogn 但是本題好像還有一種玄學做題法 我們充分發揚人類智慧型 將所有點全部繞原點旋轉同乙個角度,然後按x座標排序 根據數學直覺,在隨機旋轉後,答案中的兩個點在陣列中肯定不會離得太遠 所以我們只取每個點向後的5個點來計算答案 這樣速度快得飛起,在n 100000...