zoukankan      html  css  js  c++  java
  • 最近点对 (迭代器访问数据)

    #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, distance((*it).x, (*(it + j)).x, (*it).y, (*(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
    ", 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
    ", v[i].x, 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
    ", a, b,c, d);
    	end = clock();
    	printf("
    时间 %f s
    ", ((double)(end - start)) / CLOCKS_PER_SEC);
    	printf("距离=%lf", t);
    	getchar();
    	getchar();
    	return 0;
    }
    

      

  • 相关阅读:
    HDU 5247
    HDU 4965
    CodeForces 445B
    HDU 5835
    CodeForces 731C
    HDU 5783
    CodeForces 660D
    POJ 1631
    HDU 6112
    HDU 5860
  • 原文地址:https://www.cnblogs.com/zxzmnh/p/11650401.html
Copyright © 2011-2022 走看看