最近点对 迭代器访问数据

#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;
}

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...