// 3.cpp : 定义控制台应用程序的入口点。 //
#include "stdafx.h" #include<iostream> using namespace std; class X { private: int ID; float x,y; public: int operator<=(X a) { return(y<=a.y); } X(float a,float b) { x=a; y=b; } }; class Y { private: int p; float x,y; public: int operator<=(Y a) { return(y<=a.y); }
}; float fabs(float a,float b) { float s; if(a-b<0) s=b-a; else s=a-b; return s; } template<class type> void mergesort(type a[],int n) { type *b=new type[n]; int s=1; while(s<n) { mergepass(a,b,s,n); s+=s; mergepass(b,a,s,n); s+=s; } } template<class type> void mergepass(type x[],type y[],int s,int n) { int i=0; while(i<n-2*s) { merge(x,y,i+s-1,i+2*s-1); i=i+2*s; } if(i+s<n) merge(x,y,i,i+s-1,n-1); else for(int j=i;j<=n-1;j++) y[j]=x[j]; } template<class type> void merge(type c[],type d[],int l,int m,int r) { int i=l,j=m+1,k=1; while((i<=m)&&(j<=r)) if(c[i]<=c[j]) d[k++]=c[i++]; else d[k++]=c[j++]; if(i>m) for(int q=j;q<=r;q++) d[k++]=c[q]; else for(int q=i;q<=m;q++) d[k++]=c[q]; } template<class type> inline float distance(const type & u,const type & v) { float dx=u.x-v.x; float dy=u.y-v.y; return sqrt(dx*dx+dy*dy); } void closest(X x[],Y y[],Y z[],int l,int r,X & a,X & b,float & d) { if(r-l==1) { a=x[l]; b=x[r]; d=distance(x[l],x[r]); return; } if(r-1==2) { float d1=distance(x[l],x[l+1]); float d2=distance(x[l+1],x[r]); float d3=distance(x[l],x[r]); if(d1<=d2&&d1<=d3) { a=x[l]; b=x[l+1]; d=d1; return; } if(d1<=d3) { a=x[l+1]; b=x[r]; d=d2; } else { a=x[l]; b=x[r]; d=d3; } return; } int m=(l+r)/2; int f=l,g=m+1; for(int i=l;i<=r;i++) if(y[i].p>m) z[g++]=y[i]; else z[f++]=y[i]; closest(x,y,z,l,m,a,b,d); float dr; pointx ar,br; closest(x,z,y,m+1,r,ar,br,dr); if(dr<d) { a=ar; b=br; d=dr; } merge(z,y,l,m,r); int k=l; for(int i=l;i<=r;i++) if(fabs(y[m].x-y[i].x)<d) z[k++]=y[i]; for(int i=l;i<k;i++) { for(int j=i+1;j<k&&z[j].y-z[i].y<d;j++) { float dp=distance(z[i],z[j]); if(dp<d) { d=dp; a=x[z[i].p]; b=x[z[j].p]; } } } } bool cpair2(X x[],int n,X & a,X & b,float & d) { if(n<2) return false; mergesort(x,n); pointy *y=new pointy[n]; for(int i=0;i<n;i++) { y[i].p=i; y[i].x=x[i].x; y[i].y=x[i].y; } mergesort(y,n); pointy *z=new pointy[n]; closest(x,y,z,0,n-1,a,b,d); delete[] y; delete[] x; return true; }
int _tmain(int argc, _TCHAR* argv[]) { xx a; xx b; float c; X xx(1,2); X xx(2,3); X xx(3,4); cpair2(xx,3,a,b,c) return 0; }
1:格式太太太混乱
2:你的问题是什么?
代码错误。
@1古月1: 你这种问题只能绕着走。,。。
@Wang Hui: 什么绕着走
@1古月1: 意思就是你这种问题没法回答,有多少人有耐心看你的大片代码,而且是格式机器混乱,命名不规范且无实际意义,就连最起码的代码功能也不说一下!学习一下如何提问,如何让别人尽快进入你的问题,理解你的意思。
代码错误! 这算什么错误。。。。。
你应该说出你的问题,,不是把代码复上来,这样人家才能帮你嘛