算法实验(四)Closet-Points Problem

来源:互联网 发布:社交网络电影讲的什么 编辑:程序博客网 时间:2024/04/28 12:05

 #include "stdafx.h"
#include "point.h"
#include <queue>
#include <iostream.h>
#include<list>
#define numof_points 3
using  namespace std;
bool operator <(point a,point b)
{return (a.x<b.x);}

int search(vector<point> &a,int left,int right )
{


if (left==right)
return 100000;
if (right-left==1)
return (a[right].x-a[left].x)*(a[right].x-a[left].x)+(a[right].y-a[left].y)*(a[right].y-a[left].y)


;


int h=search(a, left,(left+ right)/2 );
int k=search(a, (left+ right)/2+1,right );
int p=h<k?h:k;

    priority_queue <point> tt;
 vector <point> ll;
/* for (int i=0;i<numof_points;i++)
 {
 d.push_back(heap.top());
 heap.pop();
*/ 

for (int s=left;s<=right;s++)//选出长条之间的点
{
 if (abs(a[s].x-a[(left+ right)/2].x)<=p)
 {
     a[s].swap();//对y坐标排序
  tt.push(a[s]);
 }

}

while(!tt.empty())
{
ll.push_back(tt.top());
tt.pop();

}


for (int ii=0;ii<ll.size();  ll[ii].swap(),ii++)
for (int iii=ii+1;iii<ll.size();iii++)
if (ll[ii].x-ll[iii].x>p)
{
    ll[ii].swap();
 break;
}
else if ( (ll[ii].x-ll[iii].x)*(ll[ii].x-ll[iii].x)+(ll[ii].y-ll[iii].y)*(ll[ii].y-ll[iii].y)<p
)

p=(ll[ii].x-ll[iii].x)*(ll[ii].x-ll[iii].x)+(ll[ii].y-ll[iii].y)*(ll[ii].y-ll[iii].y);

 

return p;

 


}


int main(int argc, char* argv[])
{


 priority_queue<point   >   heap;
 
 for(int i=0;i<numof_points;i++)
 {
  cout<<"input point "<<i<<endl ;
 point pp;
 cin>>pp.x;
 cin>>pp.y;
 pp.no=i;
 heap.push(pp);
 
 } 
 
 vector <point> d;
 for (i=0;i<numof_points;i++)
 {
 d.push_back(heap.top());
 heap.pop();
 
 
 }


int mindis=search(d,0,d.size()-1);
cout<<mindis<<endl;

 


 return 0;