Вступление
Арена представляет собой равнину, усеянную небоскребами, которую враги используют для укрытия. Вы и ваши враги стреляете друг в друга лазерами. Все вы несете реактивные ранцы, позволяющие полет.
Какие враги вы можете ударить с помощью лазера, а какие скрываются?
проблема
Во-первых, размер арены задается целым числом n
в одной строке. Следующие n
строки содержат n
целые числа в строке, разделенные пробелом. Каждое целое число представляет высоту здания в этом месте. Каждое здание представляет собой прямоугольное тело, 1 единица на 1 единицу по высоте.
Далее, ваше местоположение дается на одной линии , как три числа с плавающей точкой x
, y
, z
.
Наконец, количество врагов задается целым числом m
в одной строке. Следующие m
строки содержат три числа с плавающей точкой на строку, разделенные пробелом. Они представляют x
, y
и z
координаты противника. Система координат определяется следующим образом:
x
измеряется слева направо в вводе городаy
измеряется сверху внизz
измеряется с нуля
Для каждого врага, если от вас до этого противника можно провести беспрепятственную линию, выведите положительное целое число. В противном случае выведите отрицательное целое число. Отдельные выходы новой строкой.
Пример ввода
Комментарии, обозначенные знаком «#», помогут вам быстро увидеть, что делает каждая строка. Они не будут присутствовать в фактическом вводе.
5 # Size of the map
0 0 0 0 0 # Buildings
0 0 0 0 0 # Buildings
4 4 4 4 4 # Buildings
0 0 0 0 0 # Buildings
0 0 0 0 0 # Buildings
2.5 0.0 4.0 # Your location
3 # Number of enemies
2.5 5.0 0.1 # Enemy location
2.5 5.0 5.0 # Enemy location
0.0 2.7 4.5 # Enemy location
Образец вывода
Для приведенного выше примера ввода мы выводим следующее:
-1
1
1
Предположения
- 0
n
<<100 - 0
m
<<100 - 0 <=
x
<=n
- 0 <=
y
<=n
- 0 <=
z
<n
- Игроки не будут находиться внутри или внутри угла, края или стороны здания
- Ваша линия обзора противника никогда не будет касаться угла, края или стороны здания
- Игрок не является препятствием
Ответы:
Perl,
301 296282Редактировать 2: На самом деле, соревнование или нет, нет причин не играть в гольф немного дальше. Проверьте это онлайн .
Редактировать: пара скобок пропала, более простое регулярное выражение для проверки ненулевого целого числа.
С переводом строки и отступом для удобства чтения:
Требуется
5.14
из-за скалярного (ссылка на массив) аргумента дляpop
.источник
PE
соединяет две точки в трехмерном пространстве: «Игрок» (X1Y1Z1) и «Враг» (X2Y2Z2). Его проекция на(XY)
плоскость пересекает некоторые линии сетки, т. Е. Целые числаx = const
илиy = const
такие какX1 < x < X2
илиY1 < y < Y2
(при условии, что, напримерX1 < X2
, но это не важно). Координатыx y
этих пересечений можно легко найти, и, следовательно,z
координаты точки наPE
линии тоже.x y
координат мы знаем высотуh
здания (точнее, максимальную высоту до 4 зданий, которые имеют общуюx y
точку). Враг может быть убит, если (и только если)h < z
для всех упомянутых выше «точек пересечения». Реализация - это некоторая базовая арифметика, а также несколько трюков с Perl для игры в гольф. Расшифровка деталей того, как я это сделал месяц назад, займет некоторое время :-).@a
массива вgrep
выражении должны появляться в порядке0,3,0,4,1,5,2
вместо3,0,3,1,4,2,5
- извините.Python 2,7 -
429420308308 символовЯ думал об этой задаче скорее как о математической задаче, чем о коде, так что не будьте слишком резкими, если я пропустил некоторые очевидные оптимизации. В любом случае, вот код:
Это должно работать для краевых и угловых случаев (каламбур непреднамеренный) и довольно солидно. Выход за предоставленный пример:
И вот «краткое» объяснение:
Я предполагаю, что это полно недостатков. Кстати, я сохранил символы при вложении (первый уровень - это один пробел, второй - одна вкладка, затем одна вкладка и пробел ...). Я надеюсь, что после всего этого ответа можно указать способ сделать это.
источник
print 1-2*...
вместоprint.5-...
), так что это не такая большая разница, я думаюС - 2468
Совсем не игра в гольф, но, надеюсь, это отправная точка для более интересных реализаций. Реализация
intersect
взломана сильно от Адриана Боинга . Его псевдокод был неполным, но его объяснение математики было неоценимо. Основная идея заключается в том, что вы берете линию от игрока к цели и обрезаете ее по всем стенам каждого здания, обновляя длину для каждой стены. Оставшаяся длина - это часть внутри здания, поэтому, если она равна нулю, пересечения не было.источник