#include #include #include #include #include #define XDBG if (0) //#define XDBG if (1) unsigned rychlost; unsigned N, H; struct bod { int x, y; } *bod; struct les { int xl, xr, yh, yd; } *les; // Vzdálenost mezi dvěma body #define draha(A, B) sqrt((double)(A.x - B.x)*(A.x - B.x) + (double)(A.y - B.y)*(A.y - B.y)) #define A bod[a] #define B bod[b] #define L les[l] // Vzdálenost, kterou stráví úsečka v lese #define OUT(d) do { double dd = d; if (dd > 0) XDBG printf("%u %u %u -> %lf\n", a, b, l, dd); return dd; } while (0) //#define OUT(d) return d double husto(unsigned a, unsigned b, unsigned l) { // Když je úsečka úplně mimo, tak ji nemusíme zkoumat vůbec if ((A.x < L.xl) && (B.x < L.xl) || (A.x > L.xr) && (B.x > L.xr) || (A.y < L.yd) && (B.y < L.yd) || (A.y > L.yh) && (B.y > L.yh) ) OUT(0); // Do pole Z si uložíme body, mezi kterými pak budeme počítat vzdálenost struct bod Z[6]; unsigned zn = 0; // Je nějaký krajní bod uvnitř hustolesa? if (A.x > L.xl && A.x < L.xr && A.y > L.yd && A.y < L.yh) Z[zn++] = A; if (B.x > L.xl && B.x < L.xr && B.y > L.yd && B.y < L.yh) Z[zn++] = B; // Oba jsou uvnitř if (zn == 2) OUT(draha(A, B)); // Směrnice úsečky double yx = (double)(B.y - A.y) / (B.x - A.x); double xy = (double)(B.x - A.x) / (B.y - A.y); // Průsečíky s jednotlivými hranami // levá a pravá (souřadnice y) double yl = A.y + (double)(L.xl - A.x) * (B.y - A.y) / (B.x - A.x); double yr = A.y + (double)(L.xr - A.x) * (B.y - A.y) / (B.x - A.x); // horní a dolní (souřadnice x) double xh = A.x + (double)(L.yh - A.y) * (B.x - A.x) / (B.y - A.y); double xd = A.x + (double)(L.yd - A.y) * (B.x - A.x) / (B.y - A.y); if (((L.xl <= A.x) + (L.xl <= B.x) == 1) && (yl > L.yd && yl <= L.yh)) Z[zn++] = (struct bod) { L.xl, yl }; if (((L.xr <= A.x) + (L.xr <= B.x) == 1) && (yr >= L.yd && yr < L.yh)) Z[zn++] = (struct bod) { L.xr, yr }; if (((L.yh <= A.y) + (L.yh <= B.y) == 1) && (xh > L.xl && xh <= L.xr)) Z[zn++] = (struct bod) { xh, L.yh }; if (((L.yd <= A.y) + (L.yd <= B.y) == 1) && (xd >= L.xl && xd < L.xr)) Z[zn++] = (struct bod) { xd, L.yd }; ASSERT(zn <= 2); if (zn == 2) OUT(draha(Z[0], Z[1])); else OUT(0); } double d; int main(void) { // Čtení vstupu a alokace paměti scanf("%u %u %u\n", &rychlost, &N, &H); bod = malloc(sizeof(struct bod) * N); les = malloc(sizeof(struct les) * H); for (int i=0; i