编辑代码

#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
void input (double (*pl)[2],int n)
{
	for(int i=0;i<n;i++)
		for(int j=0;j<2;j++)
			scanf("%lf",(*(pl+i)+j));
}
double A (double Dot[50][2],int n)//找出分割线
{
	int Dot1[50];
	int mid;
	for(int i=0;i<n;i++)
		Dot1[i]==Dot[i][0];
	sort(Dot1,Dot1+n);
	if(n%2==0)
		mid=(Dot1[n/2]+Dot1[n/2+1])/2;
	if(n%2!=0)
		mid=(Dot1[(n+1)/2]+Dot1[(n-1)/2])/2;
	return mid;
}

double B(double Dot[50][2],int n,int mid)
{
	double smaller[50][2];
	double greater[50][2];
	double min;
	double nearbyRDot[50][2];
	double nearbylDot[50][2];
	int s=0;
	int g=0;
	for(int i=0;i<n;i++)
		{
		if(Dot[i][0]>mid)
			greater[g][0]=Dot[i][0],
			greater[g][1]=Dot[i][1],
			g++;
		if(Dot[i][0]<mid)
			smaller[s][0]=Dot[i][0],
			smaller[s][1]=Dot[i][1],
			s++;
	   }
	double minleft=sqrt(pow((smaller[0][0]-smaller[1][0]),2)+pow((smaller[0][1]-smaller[1][1]),2));
	double minright=sqrt(pow((greater[0][0]-greater[1][0]),2)+pow((greater[0][1]-greater[1][1]),2));
	double distance=0;
	for(int i=0;i<s;i++)
		for(int j=i+1;j<s;j++)
			{
				distance=sqrt(pow((smaller[i][0]-smaller[j][0]),2)+pow((smaller[i][1]-smaller[j][1]),2));
			if(distance<minleft)
				minleft=distance;
		    }
	for(int i=0;i<g;i++)
		for(int j=i+1;j<g;j++)
			{
				distance=sqrt(pow((greater[i][0]-greater[j][0]),2)+pow((greater[i][1]-greater[j][1]),2));
			if(distance<minleft)
				minright=distance;
		    }
	
		{if(minright>minleft)
			min=minleft;
		else min=minright;}

		int j=0;
		int k=0;
		for(int i=0;i<n;i++)
			if((abs(Dot[i][0]-mid)<=min)&&(Dot[i][0]>=mid))
				nearbyRDot[j][0]=Dot[i][0],
				nearbyRDot[j][1]=Dot[i][1],
				j++;
			else nearbylDot[k][0]=Dot[i][0],
				 nearbylDot[k][0]=Dot[i][0],
				 k++;

		double P,H;
		for(int i=0;i<j;i++)
			for(int o=i+1;o<j;o++)
			 if(nearbyRDot[i][1]>=nearbyRDot[o][1])
				P=nearbyRDot[i][1],nearbyRDot[i][1]=nearbyRDot[o][1],nearbyRDot[o][1]=P,
				H=nearbyRDot[i][0],nearbyRDot[i][0]=nearbyRDot[o][0],nearbyRDot[o][0]=H;


		double min1=sqrt(pow((nearbylDot[1][0]-nearbyRDot[1][0]),2)+pow((nearbylDot[1][1]-nearbyRDot[1][1]),2));;
		for(int i=0;i<k;i++)
			{
				for(int m=0;m<j;m++)
				{int l=0;
					if(l<4)
						if(nearbyRDot[m][1]>nearbylDot[i][1])
							distance=sqrt(pow((nearbylDot[i][0]-nearbyRDot[m][0]),2)+pow((nearbylDot[i][1]-nearbyRDot[m][1]),2));
								if(distance<min1)
									min1=distance;
								l++;
				}
				for(int m=j-1;m>0;m++ )
					{
						int f=0;
						if(f<4)
							if(nearbyRDot[m][1]<nearbylDot[i][1])
								distance=sqrt(pow((nearbylDot[i][0]-nearbyRDot[f][0]),2)+pow((nearbylDot[i][1]-nearbyRDot[f][1]),2));
									if(distance<min1)
										min1=distance;
								f++;
						
					}
			}
				


		if(min1>min) return min;
		else return min1;
			
}

int main()
{
	int n;
	double Dot[50][2], *pl=Dot[0],mid;
	scanf("%d",&n);
	input(Dot,n);
	mid=A(Dot,n);
	printf("%f",B(Dot,n,mid));

}