#include #include #include #include #include #define TASKNAME "pool" typedef double real; typedef long long int64; const int MinN = 5, MaxN = 1000, MinK = 1, MaxK = 100, MinR = 1, MaxR = 20, MinL = 1, MaxL = 1000, MaxD = 100; const real MaxC = 1E25, eps = 1E-10; /* Константы для обозначения и вывода ответа */ enum STATE {STOP, BOARD, TOUCH, STATE_NUM}; const char NAMES [STATE_NUM] [64] = {"STOP", "BOARD", "TOUCH"}; int x [MaxK], y [MaxK]; int main (void) { int state; int i, j; int k, l, m, n, a, r, r2; int dx, dy, x0, y0, c, e, d2; int64 e2, f; real d, g, h, s, t; freopen (TASKNAME ".in", "rt", stdin); freopen (TASKNAME ".out", "wt", stdout); /* 1. Чтение входных данных */ /* Цикл для возможности тестирования более чем на одном тесте сразу */ while (scanf (" %d %d %d %d %d %d", &m, &n, &k, &r, &l, &a) != EOF) { a--; scanf (" %d %d", &dx, &dy); for (i = 0; i < k; i++) scanf (" %d %d", &x[i], &y[i]); r2 = r * r; x0 = x[a]; y0 = y[a]; state = STOP; d2 = dx * dx + dy * dy; /* квадрат длины вектора */ d = sqrt (d2); /* длина вектора, задающего направление */ s = MaxC; /* время столкновения с каким-либо объектом */ /* 2. Проверка выхода за границу поля */ if (dx != 0) { t = (r - x0) * d / dx; if (t >= 0.0 && s > t) s = t; t = ((m - r) - x0) * d / dx; if (t >= 0.0 && s > t) s = t; } if (dy != 0) { t = (r - y0) * d / dy; if (t >= 0.0 && s > t) s = t; t = ((n - r) - y0) * d / dy; if (t >= 0.0 && s > t) s = t; } if (l >= s - eps) /* касание произойдёт за отведённое время l */ { state = BOARD; } /* 3. Проверка столкновений с другими шарами */ if (s > l) s = l; /* если s останется равным l, то столкновений не было */ c = dy * x0 - dx * y0; /* константа в уравнении прямой */ /* прямая, по которой движется шар: dy * x - dx * y = c */ for (i = 0; i < k; i++) if (i != a) { e = dy * x[i] - dx * y[i]; /* константа для точки i */ e = abs (e - c); /* шары столкнутся, если константы отличаются не более, чем на d * 2r */ e2 = e; e2 *= e; f = r2 * 4; f *= d2; if (e2 <= f) { /* найдём момент времени, в которой шары коснулись */ g = e / d; /* h - время от касания до момента максимальной близости центров шаров */ h = r2 * 4 - g * g; if (h < 0.0) h = 0.0; h = sqrt (h); /* t - время, когда центры шаров ближе всего друг к другу */ t = dx * x[i] + dy * y[i]; t -= dx * x0 + dy * y0; t /= d; t -= h; /* если отнять h от t, получится момент касания */ /* проверим, что столкновение произошло раньше, чем предыдущие найденные */ if (t >= 0.0 && s > t) { s = t; if (l >= s - eps) { state = TOUCH; break; } } } } /* 4. Вывод ответа */ printf ("%s\n", NAMES[state]); } return 0; }