Photolog

Through the Looking-Glass
2010-10-12: Through the Looking-Glass
My radio speaks is binary!
2010-10-10: My radio speaks is binary!
Gigaminx: (present for my birthday)
2010-09-16: Gigaminx: (present for my birthday)
Trini on bike
2010-09-05: Trini on bike
Valporquero
2010-08-28: Valporquero
My new bike!
2010-08-22: My new bike!
Mario and Ana's wedding
2010-08-13: Mario and Ana's wedding
Canyoning in Guara
2010-08-07: Canyoning in Guara
Trini and Mari in Marbella
2010-08-05: Trini and Mari in Marbella
Trini and Chelo in Tabarca
2010-08-03: Trini and Chelo in Tabarca
Valid XHTML 1.1
Log in
Back to list of problems

Bumpy Objects

132.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define EPS 1E-10

#define eq(a,b) (fabs(a-b) < EPS)

#define MAX(a,b) ((a) > (b) ? (a) : (b))

typedef struct {
	double x;
	double y;
} punto;

typedef struct {
	char * name;
	double gx;
	double gy;
	int np;
	punto * p;
} poly;

punto
psub(punto p1, punto p2) {
	punto p;

	p.x = p2.x - p1.x;
	p.y = p2.y - p1.y;
	return p;
}

double
cross(punto v1, punto v2) {
	return v1.x*v2.y - v2.x*v1.y;
}

int
try(poly *p, int a, int b) {
	int i;
	int sign=0;
	double c;
	int max = MAX(a,b)+1;
	for (i=0; i<p->np; i++) {
		if (i==a || i==b) {
			continue;
		}
		c = cross(psub(p->p[a], p->p[b]), psub(p->p[a], p->p[i]));
		if (eq(c,0.0)) {
			max = MAX(max,i+1);
		} else if (sign==0) {
			sign = (int)(c / abs(c));
		} else {
			if (sign != (int)(c / abs(c))) {
#if DEBUG
				printf("HCK: try(%d,%d) = -1\n", a, b);
#endif
				return -1;
			}
		}
	}
#if DEBUG
				printf("HCK: try(%d,%d) = %d\n", a, b, max);
#endif
	return max;
}

void
doit(poly * p) {
	int i,j,k;
	int base=1000000000;
	for (i=0; i<p->np-1; i++) {
		for (j=i+1; j<p->np; j++) {
			k = try(p, i,j);
			if (k>0 && k<base) {
				base=k;
			}
		}
	}
	printf("%-20s%d\n", p->name, base);
}

int
main(void) {
	char buf[1024];
	poly p;
	double a,b;

	while (1) {
		fgets(buf, sizeof(buf), stdin);
		if (buf[0]=='#' && (buf[1]==' ' || buf[1]=='\r' || buf[1]=='\n' || buf[1]=='\0')) {
			return 0;
		}
		while (buf[strlen(buf)-1]=='\r' || buf[strlen(buf)-1]=='\n') {
			buf[strlen(buf)-1]='\0';
		}
		p.name = buf;
		scanf("%lf %lf", &p.gx, &p.gy);
		p.np = 0;
		while (scanf("%lf %lf", &a, &b)==2 && (!eq(a,0.0) || !eq(b,0.0))) {
			p.p = realloc(p.p, (p.np+1)*sizeof(punto));
			p.p[p.np].x = a;
			p.p[p.np].y = b;
			p.np++;
		}
		doit(&p);
		fgets(buf, 1024, stdin);
	}
}