#include #include struct pt { int x, y; }; // Bod #define MAX 10000 struct pt B[MAX]; // Zadané body int N; int Sp[MAX], Fp[MAX]; // Do páru podle S/F nebo -1 int lex_cmp(const void *A, const void *B) { // Lexikografické porovnání dvou bodů const struct pt *a=A, *b=B; if (a->x < b->x) return -1; if (a->x > b->x) return 1; if (a->y < b->y) return -1; if (a->y > b->y) return 1; return 0; } struct pt stred(struct pt A, struct pt B) { // Střed úsečky return (struct pt) { (A.x+B.x)/2, (A.y+B.y)/2 }; } struct pt obraz(struct pt A, struct pt S) { // Obraz bodu A podle středu S return (struct pt) { 2*S.x - A.x, 2*S.y - A.y }; } void pary(struct pt S, int *Sp) { // Najde všechny páry (hrany) podle středu S int i=0, j=N-1; while (i <= j) { struct pt O = obraz(B[i], S); // Obraz bodu B[i] int c = lex_cmp(&O, &B[j]); // porovnáme s B[j] if (!c) { Sp[i] = j, Sp[j] = i; // trefa => pár i++, j--; } else if (c < 0) // B[j] se už nikdy nespáruje Sp[j--] = -1; else // B[i] se už nikdy nespáruje Sp[i++] = -1; } } int main(void) { while (scanf("%d%d", &B[N].x, &B[N].y) == 2) { // Finta: vynásobíme souřadnice dvěma, takže // středy všech úseček vyjdou celočíselně. B[N].x *= 2, B[N].y *= 2; N++; } qsort(B, N, sizeof(B[0]), lex_cmp); for (int i=0; i= 0) j++; for (int k=0; k= 0); if (!(kroku%2)) goto spatne; } printf("S=(%d,%d) F=(%d,%d)\n", S.x/2, S.y/2, F.x/2, F.y/2); return 0; spatne: ; } } printf("Není souměrné. Toť na draka, milý draku.\n"); return 0; }