题目大意:输入n不为0时,表示接受n个点的坐标,求这些坐标之间最小距离。
本来是把数组放在主函数里面的,结果是Runtime Error(STACK_OVERFLOW) (貌似是数组太大,空间不够的意思)。把数组降低,结果是Runtime Error(ACCESS_VIOLATION)。烦的要死,难道就只能用c++的排序?c++的vector倒是非常好用,能够动态改变大小,c语言就没有类似的么?有知道的大神告知下的么?
非常郁闷的吃完午饭回来,顺手把数组设置为全局变量,然后~~~就过了。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct point
{
double x;
double y;
}point;
point coo[100001];
int cmp(const void*a,const void*b)
{
point *c=(point *)a;
point *d=(point *)b;
if(c->y!=d->y)
return c->y-d->y>0?1:-1;
else
return c->x-d->x>0?1:-1;
}
int main()
{
int n,i,j;
double len,temp;
while(scanf("%d",&n)!=EOF&&n)
{
for(i=0;i<n;i++)
scanf("%lf %lf",&coo[i].x,&coo[i].y);
qsort(coo,n,sizeof(coo[0]),cmp);
len=(coo[1].x-coo[0].x)*(coo[1].x-coo[0].x);
len+=(coo[1].y-coo[0].y)*(coo[1].y-coo[0].y);
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(coo[j].y-coo[i].y>=sqrt(len))
break;
temp=(coo[j].x-coo[i].x)*(coo[j].x-coo[i].x);
temp+=(coo[j].y-coo[i].y)*(coo[j].y-coo[i].y);
if(temp<len)
len=temp;
}
}
printf("%.2f\n",sqrt(len)/2);
}
return 0;
}