Вторая по списку игра на сайте codingame.com проверяет умение примата пользоваться условными операторами, интуицией и программой по физике за десятый класс. По легенде, на постапокалиптических просторах Земли будущего раскинулась зловещая империя враждебных человеку роботов, но инженерный гений непокоренных программистов-взломщиков дает человечеству шанс на выживание. Подрывная деятельность начинается с малого: под дистанционный контроль удалось взять кремниевые мозги скоростного робота, внешностью и повадками напоминающего модифицированный мотоцикл. Наша задача — создать алгоритм управления, позволяющий машине преодолевать препятствия.
Инициализация:
Каждый уровень поделен на три этапа:
- Движение по стартовой площадке.
- Прыжок через пропасть.
- Торможение на финишной прямой.
До начала игрового цикла программа считывает данные о длине каждого из элементов уровня и сохраняет соответственно в переменные [latex]R, G, L[/latex].
Игровой цикл
На каждой итерации входной поток содержит:
- Координату мотоцикла [latex]X[/latex].
- Мгновенную скорость мотоцикла [latex]S[/latex].
В выходной поток необходимо вывести одну из четырех команд:
- JUMP — совершить прыжок.
- SPEED — увеличить скорость на единицу.
- SLOW — уменьшить скорость на единицу.
- WAIT — ждать следующего хода.
Прежде чем приступить к решению, проанализируем и формализуем задачу.
- Размеры мотоцикла не играют роли, потому его движение в рамках рассматриваемой задачи эквивалентно движению материальной точки.
- Движение равномерное ([latex]a = 1 \vee a = -1 \vee a = 0[/latex]).
- Скорость движения должна быть достаточно большой, чтобы успешно перемахнуть через пропасть, но и достаточно маленькой, чтобы успеть затормозить на финишной прямой. И первое, и второе условие нетрудно рассмотреть аналитически: [latex]S > G + 1 \wedge L > \frac {S^{2}}{2}[/latex]. В первом условии скорость взята «с запасом», так как мотоцикл не обязательно прыгает с края платформы. Второе условие нетрудно получить из уравнения равнозамедленного движения по финишной платформе: [latex]L = vt — \frac {t^{2}}{2} => t^{2} — 2vt + 2L = 0 \quad D = v^{2} — 2L \ge 0 => L \ge \frac {v^{2}}{2}[/latex]. Таким образом, оба условия обоснованы.
- Если условие [latex]X+S > R[/latex] истинно, мотоциклисту следует совершить прыжок.
Резюмируя: для успешного прохождения полосы препятствий необходимо:
- Привести скорость мотоцикла к значению, удовлетворяющему условию (3).
- Прыгнуть через пропасть, когда значения координаты и скорости удовлетворяют условию (4).
- Затормозить.
Программная реализация алгоритма:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include <iostream> using namespace std; int main() { int R; // the length of the road before the gap. cin » R; cin.ignore(); int G; // the length of the gap. cin » G; cin.ignore(); int L; // the length of the landing platform. cin » L; cin.ignore(); // game loop while (1) { int S; // the motorbike's speed. cin » S; cin.ignore(); int X; // the position on the road of the motorbike. cin » X; cin.ignore(); if (X + S > R && X <= R) //if next step can be the last - JUMP! cout « "JUMP" « endl; if (X < R-1) //some additional space must always be { if (L < S*S/2 ) cout « "SLOW" « endl; //lower the speed to safe limit else { if (S < G+1) //we can jump before the road ends, so we need some additional speed to avoid falling down cout « "SPEED" « endl; //or accelerate else cout « "WAIT" « endl; //if everything is OK, just wait } } else cout « "SLOW" « endl; //slow down, the goal is reached } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
import java.util.*; import java.io.*; import java.math.*; class Player { public static void main(String args[]) { Scanner in = new Scanner(System.in); int road = in.nextInt(); // the length of the road before the gap. int gap = in.nextInt(); // the length of the gap. int platform = in.nextInt(); // the length of the landing platform. // game loop while (true) { int speed = in.nextInt(); // the motorbike's speed. int coordX = in.nextInt(); // the position on the road of the motorbike. if(coordX + speed > road && coordX <= road) System.out.println("JUMP"); if(coordX < road-1){ if(platform < speed*speed/2) System.out.println("SLOW"); else{ if(speed < gap+1) System.out.println("SPEED"); else System.out.println("WAIT"); } } else{ System.out.println("SLOW"); } } } } |
Эффективность предложенного алгоритма:
Программа успешно проходит все четыре испытания. В процессе тестирования ни один робот не пострадал.
Технические детали реализации:
В коде использованы инструменты потокового ввода-вывода из заголовочного файла iostream и условные операторы.
Принято. только если уже есть решения этой задачи, то нужно дать ссылку и обосновать почему важно рассмотреть ещё раз.
Лучше избегать повторов, просто при необходимости писать комментарии и дополнения к уже имеющейся работе.
Понял, учту. Игр ещё много, буду проходить те, к которым пока нет решений на нашем сайте.
Java версия засчитана, 10 баллов.