1 #include<stdlib.h> 2 #include<stdio.h> 3 #include<iostream> 4 #include<math.h> 5 #include<algorithm> 6 #include <time.h> 7 8 #define MAX 99999 9 using namespace std; 10 11 struct point{ //点结构 12 double x,y; 13 }; 14 15 double Distance(point a,point b){ 16 return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); 17 } 18 bool cmp(point a,point b){ //按y升排序辅助函数 19 return a.y<b.y; 20 } 21 bool cmp2(point a,point b){ //按x升排序辅助函数 22 return a.x<b.x; 23 } 24 double closestPoint(point s[],int low,int high,point rec[]){ 25 double d1,d2,d3,d; 26 int mid,i,j,index; 27 double x1,y1,x2,y2; //记录点对的位置 28 point P[high-low+1],temp1[2],temp2[2],temp3[2]; //辅助空间 29 if(high-low==1){ //两个点的情况 30 rec[0].x=s[low].x;rec[0].y=s[low].y; 31 rec[1].x=s[high].x;rec[1].y=s[high].y; 32 return Distance(s[low],s[high]); 33 } 34 if(high-low==2){ //三个点的情况 35 d1=Distance(s[low],s[low+1]); 36 d2=Distance(s[low+1],s[high]); 37 d3=Distance(s[low],s[high]); 38 if((d1<d2)&&(d1<d3)){ 39 rec[0].x=s[low].x;rec[0].y=s[low].y; 40 rec[1].x=s[low+1].x;rec[1].y=s[low+1].y; 41 return d1; 42 } 43 else if(d2<d3){ 44 rec[0].x=s[low+1].x;rec[0].y=s[low+1].y; 45 rec[1].x=s[high].x;rec[1].y=s[high].y; 46 return d2; 47 } 48 else { 49 rec[0].x=s[low].x;rec[0].y=s[low].y; 50 rec[1].x=s[high].x;rec[1].y=s[high].y; 51 return d3; 52 } 53 } 54 mid=(low+high)/2; //其他情况递归 55 d1=closestPoint(s,low,mid,rec); 56 temp1[0]=rec[0]; 57 temp1[1]=rec[1]; 58 d2=closestPoint(s,mid+1,high,rec); 59 temp2[0]=rec[0]; 60 temp2[1]=rec[1]; 61 if(d1<d2){ 62 d=d1; 63 rec[0]=temp1[0]; 64 rec[1]=temp1[1]; 65 } 66 else { 67 d=d2; 68 rec[0]=temp2[0]; 69 rec[1]=temp2[1]; 70 } 71 index=0; 72 for(i=mid;(i>=low)&&((s[mid].x-s[i].x)<d);i--) //点集合p1 73 P[index++]=s[i]; 74 for(i=mid+1;(i<=high)&&((s[i].x-s[mid].x)<d);i++) //点集合p2 75 P[index++]=s[i]; 76 sort(P,P+index,cmp); //升序排列 77 for(i=0;i<index;i++){ 78 for(j=j+1;j<index;i++){ 79 if((P[j].y-P[i].y)>=d) 80 break; 81 else { 82 d3=Distance(P[i],P[j]); 83 if(d3<d){ 84 rec[0].x=P[i].x;rec[0].y=P[i].y; 85 rec[1].x=P[j].x;rec[1].y=P[j].y; 86 d=d3; 87 } 88 } 89 } 90 } 91 return d; 92 } 93 94 //double closestPoints(double x[],double y[],int n){ 95 // double x1,x2,y1,y2; //记录下标 96 // double dist,minDist=MAX; 97 // for(int i=0;i<n;i++) 98 // for(int j=i+1;j<n;j++){ 99 // dist=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]); //计算距离 100 // if(dist<minDist){ 101 // minDist=dist; 102 // x1=x[i];y1=y[i]; 103 // x2=x[j];y2=y[j]; 104 // } 105 // } 106 // cout<<"最近点对为:("<<x1<<","<<y1<<")-("<<x2<<","<<y2<<")"; //输出坐标 107 // return minDist; 108 //} 109 110 111 112 int mainz(){ 124 125 point p[100]; //设定点的集合 126 int d=50; 127 srand((unsigned)time(NULL)); 128 for(int i = 0; i < 25;i++ ) 129 { 130 p[i].x = rand()%d+1; 131 p[i].y = rand()%d+1; 132 d++; 133 cout<<p[i].x<<"--"<<p[i].y<<" "; 134 } 135 printf(" "); 136 int n=25; 137 double minDist; 138 139 // cout<<"输入点的个数: "; //输入点的个数 140 // cin>>n; 141 // cout<<"输入点集:(x,y) "; 142 // for(int i=0;i<n;i++) 143 // cin>>p[i].x>>p[i].y; 144 145 sort(p,p+n,cmp2); 146 point index[2]; 147 minDist=closestPoint(p,0,n-1,index); 148 cout<<"最小距离点对为:("<<index[0].x<<","<<index[0].y<<"),("<<index[1].x<<","<<index[1].y<<") "; 149 cout<<"最小距离为: "<<minDist; //输出点对的最小问题 150 return 0; 151 }