//领悟了双重带参宏 #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.