#include<iostream> #include<stdio.h> #include<vector> #include<algorithm> #include<time.h> #include<set> #pragma warning(disable:4996) using namespace std; struct coordinate { int x,y; }; bool cmp_x(coordinate &a,coordinate &b) { return a.x < b.x; } bool cmp_y(coordinate &a,coordinate &b) { return a.y < b.y; } int n; double distance(double x1,double x2,double y1,double y2) { return sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2)); } double min(double a,double b) { return a < b ? a : b; } double merge(int l,int r,vector<coordinate> &v) { if (r == l) return 0xffffff; if (r - l == 1) return distance(v[l].x,v[r].x,v[l].y,v[r].y); int mid = (l + r) >> 1; double d1 = merge(l,mid,v); double d2 = merge(mid,r,v); double d = min(d1,d2); vector<coordinate>p1,p2; int i = mid,j = mid; while (i >= l && v[i].x >= v[mid].x - d) p1.push_back(v[i]),i--; while (j <= r && v[j].x <= v[mid].x + d)p2.push_back(v[j]),j++; sort(p1.begin(),p1.end(),cmp_y); sort(p2.begin(),p2.end(),cmp_y); double min1 = 0xffffff,min2 = 0xffffff; for (vector<coordinate>::iterator it = p1.begin(); it < p1.end(); it++) { for (int j = 1; j < 8 && it + j < p1.end(); j++) { min1 = min(min1,distance((*it).x,(*(it + j)).x,(*it).y,(*(it + j)).y));//(*it).x } } for (vector<coordinate>::iterator it = p2.begin(); it < p2.end(); it++) { for (int j = 1; j < 8 && it + j < p2.end(); j++) { min2 = min(min2,(*(it + j)).y)); } } return min(d,min(min1,min2)); } int main() { clock_t start,end; start = clock(); srand(time(NULL)); //cin >> n; n = rand() % 20 + 30; cout << n << endl; vector<coordinate>v(n + 1); //set<coordinate>ju; for (int i = 1; i <= n; i++) { v[i].x = rand() % 100,v[i].y = rand() % 100; //printf("%d %d\n",v[i].x,v[i].y); } sort(v.begin(),v.end(),cmp_x); double t = merge(1,n,v); int a,b,c,d; for (int i = 1; i <= n; i++) { printf("%d %d\n",v[i].y); if (i != 1) { if (distance(v[i].x,v[i - 1].x,v[i].y,v[i - 1].y) == t) { a = v[i].x,b = v[i].y,c = v[i - 1].x,d = v[i - 1].y; } } } printf("最近点对 :%d %d %d %d\n",a,d); end = clock(); printf("\n时间 %f s\n",((double)(end - start)) / CLOCKS_PER_SEC); printf("距离=%lf",t); getchar(); getchar(); return 0; }