平面4点的最小距离
已知平面上若干个点的坐标。
需要求出在所有的组合中,4个点间平均距离的最小值(四舍五入,保留2位小数)。
比如有4个点:a,b,c,d, 则平均距离是指:ab, ac, ad, bc, bd, cd 这6个距离的平均值。
每个点的坐标表示为:横坐标,纵坐标
坐标的取值范围是:1~1000
例如,如果程序输入:
10,10
20,20
80,50
10,20
20,10
则程序应该输出:
11.38
1 #include<stdio.h> 2 #include<malloc.h> 3 #include<math.h> 4 typedef struct Point 5 { 6 double x; 7 double y; 8 }Point; 9 10 double result[1000];//用于保存平均值 11 Point r[4]; 12 int k=0,index=0; 13 14 //求距离 15 double distance(Point A,Point B) 16 { 17 double x=B.x-A.x; 18 double y=B.y-A.y; 19 double sum2=x*x+y*y; 20 return sqrt(sum2); 21 } 22 23 //返回四个点的平均距离 24 double avg(Point A,Point B,Point C,Point D) 25 { 26 double sum=0; 27 sum+=distance(A,B); 28 sum+=distance(A,C); 29 sum+=distance(A,D); 30 sum+=distance(B,C); 31 sum+=distance(B,D); 32 sum+=distance(C,D); 33 return sum/6; 34 } 35 //选四个点并计算出平均值保存到result数组 36 void reSort(Point *p, int pLen, int printLen) 37 { 38 if (pLen < printLen)return; 39 if (printLen <= 0)//输出结果 40 { 41 result[k++]=avg(r[0],r[1],r[2],r[3]);//计算四个点的平均值 42 return; 43 } 44 for(int i = 0; i < pLen; i++) 45 { 46 r[index++]=p[i]; 47 reSort(p+i+1, pLen-i-1, printLen-1); 48 index--; 49 } 50 } 51 //返回数组中的最小值 52 double min() 53 { 54 double min=result[0]; 55 for(int i=1;i<k;i++) 56 if(min>result[i]) 57 min=result[i]; 58 return min; 59 } 60 61 int main() 62 { 63 int n;//点的数量 64 printf("输入点的数量:");scanf("%d",&n); 65 Point *p=(Point*)malloc(sizeof(Point)*n);//申请n个点的空间 66 for(int i=0;i<n;i++)//输入n个点的信息 67 scanf("%lf,%lf",&(p[i].x),&(p[i].y)); 68 fflush(stdin); 69 reSort(p,n,4);//选四个点并计算 70 printf("%.2lf\n",min());//输出最小值 71 getchar(); 72 return 0; 73 }