Автор: | Maxim Kuzin | Ограничение времени: | 30 сек | |
Входной файл: | input.txt | Ограничение памяти: | 256 Мб | |
Выходной файл: | output.txt | |||
Максимальный балл: | 100 |
Представьте, что вы потерялись в лабиринте и не можете найти выход. А еще там абсолютная темнота и вы ничего не видите.
К счастью, сейчас вы не в лабиринте, но нужно быть готовым ко всему. Поэтому необходимо написать программу, которая научится искать выход из лабиринта не зная его структуры.
Чтобы упростить задачу, вам предлагается сцена в Unity
с лабиринтом и шаром. Вы можете указать время и вектор скорости для шара. В течении указанного вами времени шар будет двигаться в направлении вектора с заданной скоростью без ускорения. По истечении этого времени вам опять дадут возможность указать новое время и вектор скорости.
Вы можете управлять шаром только когда задаете ему новую скорость. В этот же момент вы можете узнать его текущие координаты. Пока шар двигается вы не можете узнать его местоположение.
Программно вы не можете узнать координаты стен и точку выхода из лабиринта. Но вам гарантируется, что до нее можно добраться из изначальной точки (места, где изначально находится шар). Также вам гарантируется, что шар упруго отталкивается от стен.
Вам нужно реализовать функцию getMove()
в классе Solution
. Эту функция будет вызываться чтобы дать вам возможность указать новое время и вектор скорости для шара. Эта функция должна возвращать объект Vector4
состоящий из четырех параметров. Первые три отвечают за вектор скорости (y-координата будет игнорироваться), четвертый за время, в течении которого будет двигаться шар. После того, как это время закончится вам опять дадут возможность указать новое время и вектор скорости.
Длина вашего вектора скорости не должна превышать 104
Обратите внимание, что вы не можете сохранять какую-либо информацию между двумя вызовами функции. Для этого нужно использовать специальные методы в объекте controller
.
Весь ваш код должен находиться в классе Solution
. Другие изменения в сцене учитываться не будут.
Объект controller
предоставляет следующие функции для работы с памятью:
controller.Add(key, value)
— записывает в память объект value
. Позже вы сможете обратиться к нему с помощью объекта key
. Если в памяти уже было записано значение с ключом key
, то ничего не произойдет.controller.Set(key, value)
— перезаписывает в память объект value
с ключом key
. До вызова этой функции обязательно хотя бы раз должна была быть вызвана функция Add()
, чтобы создать значение в памяти.controller.Get(key)
— возвращает значение из памяти по ключу key
. До вызова этой функции обязательно хотя бы раз должна была быть вызвана функция Add()
, чтобы создать значение в памяти.controller.GetPosition()
— возвращает текущие координаты мяча.
Проект
https://github.com/Supermagzzz/NTI_TASK2
,
Вам осталось реализовать класс Solution
.
Одна клетка на поле имеет размер 4 ⋅ 4 единицы Unity
.
Вы можете тестировать свои решения, изменяя данные, содержащиеся в файле input.txt
в репозитории проекта. Красная клетка в редакторе Unity
показывает выход из лабиринта. Изучите пример Solution.cs
для лучшего понимания задачи.
Входной файл содержит пять целых чисел seed, r, c, x, y - значение для случайной генерации лабиринта, количество строк и столбцов в лабиринте, координаты выхода из лабиринта.
Реализовывать считывание данных с файла input.txt
не нужно.
Для получения данных используйте функции, реализованные в controller
.
Файл с решением должен содержать реализацию класса Solution
.
Координаты, полученные с помощью вашего решения, должны иметь погрешность
не больше одной единицы в координатах Unity
.
Реализовывать вывод в файл output.txt
не нужно.
1 ≤ r, c ≤ 10
0 ≤ x ≤ r
0 ≤ y ≤ c