View Code of Problem 15

//领悟了双重带参宏
#include<stdio.h>
#include <math.h>
#define DIS(a,b) sqrt( (po[a].x - po[b].x) * (po[a].x - po[b].x) + (po[a].y - po[b].y) * (po[a].y - po[b].y) )
#define DISS(a,b) (DIS(a,b) * DIS(a,b))
struct poss
{
    double x;
    double y;
};
int main()
{
	int n, m, i, j, k = 0;
	double s, ss;
	struct poss pos[10];
	double findmin(struct poss po[], int mm);

	scanf("%d", &n);
	while (n != 0)
	{
	    ss = 0;
	    k++;

	    for (i=0; i<n; i++)
        {
            scanf("%d", &m);
            for (j=0; j<m; j++)
                scanf("%lf %lf", &pos[j].x, &pos[j].y);

                //dis
            if (m == 3)
                ss += findmin(pos, m) * sqrt(3) / 4;
            if (m == 4)
                ss += findmin(pos, m);
            if (m == 5)
                ss += 1.72048 * findmin(pos, m);
            if (m == 6)
                ss += findmin(pos, m) * sqrt(3) / 4 * 6;
            if (m == 7)
                ss += 3.63391 * findmin(pos, m);
            if (m == 8)
                ss += findmin(pos, m) * (2 + 2 * sqrt(2));
        }

        s = ss;
        printf("Case #%d: %.4f\n", k, s);
        scanf("%d", &n);
	}
	return (0);
}
double findmin(struct poss po[], int mm)
{
    int i;
    double min;
    min = DISS(0,1);
    for (i=2; i<mm; i++)
    if (DISS(0,i)< min)
        min = DISS(0,i);
    return (min);
}

Double click to view unformatted code.


Back to problem 15