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

Mouse Clicks

142.c

/* 142 - Mouse Clicks */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
	int x;
	int y;
	int visible;
} icon;

typedef struct {
	int x1,y1;
	int x2,y2;
} region;

int nic = 0;
icon *ic = NULL;

int nre = 0;
region *re = NULL;

unsigned int
dist(int x1, int y1, int x2, int y2) {
	return (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2);
}

int
inside(int x, int y, int r) {
	if (x>=re[r].x1 && x<=re[r].x2 && y>=re[r].y1 && y<=re[r].y2) {
		return 1;
	} else {
		return 0;
	}
}

int
deep_inside(int x, int y, int r) {
	if (x>re[r].x1 && x<re[r].x2 && y>re[r].y1 && y<re[r].y2) {
		return 1;
	} else {
		return 0;
	}
}

void
read_icon(void) {
	int x,y;
	scanf("%d %d", &x, &y);
	ic = realloc(ic, (nic+1)*sizeof(icon));
	if (!ic) abort();
	ic[nic].visible = 1;
	ic[nic].x = x;
	ic[nic].y = y;
	nic++;
}

void
read_region(void) {
	int x1,y1,x2,y2;
	scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
	re = realloc(re, (nre+1)*sizeof(region));
	if (!re) abort();
	re[nre].x1 = x1;
	re[nre].y1 = y1;
	re[nre].x2 = x2;
	re[nre].y2 = y2;
	nre++;
}

void
process_mouse(void) {
	int x,y;
	int i;
	unsigned int min = (unsigned int)-1;

	scanf("%d %d", &x, &y);
	for (i=nre-1; i>=0; i--) {
		if (inside(x, y, i)) {
			printf("%c\n", 'A'+i);
			return;
		}
	}
	for (i=0; i<nic; i++) {
		unsigned int d;

		if (!ic[i].visible) {
			continue;
		}
		d = dist(x,y,ic[i].x,ic[i].y);
		if (d < min) {
			min = d;
		}
	}
	for (i=0; i<nic; i++) {
		if (!ic[i].visible) {
			continue;
		}
		if (min == dist(x,y,ic[i].x,ic[i].y)) {
			printf("%3d", i+1);
		}
	}
	printf("\n");
}

int
main(void) {
	char c;
	int i,r;
	int done = 0;

	while (scanf(" %c", &c)==1 && c!='#') {
		if (c=='I') {
			if (done) {
				abort();
			}
			read_icon();
		} else if (c=='R') {
			if (done) {
				abort();
			}
			read_region();
		} else if (c=='M') {
			if (!done) {
				done = 1;
				for (i=0; i<nic; i++) {
					for (r=0; r<nre; r++) {
						if (inside(ic[i].x, ic[i].y, r)) {
							ic[i].visible = 0;
						}
					}
				}
			}
			process_mouse();
		} else {
			abort();
		}
	}
	return 0;
}