平面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 }

posted @ 2013-05-02 11:45  Please Call me 小强  阅读(633)  评论(0编辑  收藏  举报