В здании 9 этажей и 3 лифта, которые вызываются одной кнопкой. На первом всегда должен быть свободный лифт. По нажатию на кнопку на любом этаже должен приехать лифт, расположенный наиболее близко.
Алгоритм необходмио реализовать на любом популярном объектно-ориентированном языке программирования.
Алгоритм реализован на Java в виде консольного приложения.
Если вы знаете другой (возможно, более простой) способ реализации, напишите в Issues
- номер этажа, на который нужно вызвать лифт,
- номер этажа, на который поедет лифт.
- На каком этаже находится каждый из лифтов,
- Название лифта, который приедет.
По умолчанию все лифты на первом этаже. В начале каждой поездки пользователь вводит номера этажей, куда вызвать лифт и куда лифт поедет.
Определяется ближайший лифт с учётом того, что на первом этаже один лифт должен остаться. После поездки запоминаем, куда лифт приехал — это будет учитываться при следующей поездке, если пользователь на неё согласится (напишет что-то кроме "нет"). Выводится информация о том, какой лифт приедет.
Кататься можно бесконечно, пока пользователь не ответит "нет".
В программе создаём исходный список лифтов из трёх объектов класса Elevator
— elevatorList
. У каждого лифта есть поля:
- идентификатор (0...2),
- название (№1, №2, №3),
- текущий этаж.
На начале каждой поездки пользователь должен ввести корректные (числа в диапазоне от 1 до 9 включительно) номера этажей, «откуда» и «куда» поедет лифт.
Из исходного списка лифтов создаём список «подходящих» лифтов — suitableElevators
. Считаем, сколько в нём лифтов, которые находятся на первом этаже, через getCurrentFloor
.
Если на первом этаже:
- три лифта: берём первый из списка (т.к. нам без разницы, какой лифт поедет). Запоминаем его ID.
- два лифта: сортируем список в порядке возрастания значения свойства "текущий этаж" (
currentFloor
). В получившемся списке пропускаем первый элемент, тем самым оставляя "один из лифтов на первом этаже" и "лифт на каком-то ещё этаже". Определяем, какой лифт находится ближе, черезdistanceToTheFloor(«откуда»)
. Запоминаем его ID. - один лифт: убираем его из списка. Определяем, какой лифт находится ближе, через
distanceToTheFloor(«откуда»)
. Запоминаем его ID.
В исходном списке у лифта с идентификатором, равным ID, обновляем значение текущего этажа через setCurrentFloor(«куда»)
. Теперь оно равно «куда», которое ввёл пользователь. Это пригодится при следующей поездке.
Выводим информацию, какой лифт приедет.
Спрашиваем, будет ли ещё одна поездка.
На какой этаж вызвать лифт? s
Нажмите кнопку с цифрой от 1 до 9: 0
Нажмите кнопку с цифрой от 1 до 9: 10
Нажмите кнопку с цифрой от 1 до 9: 8
На какой этаж поедем? h
Нажмите кнопку с цифрой от 1 до 9: 0
Нажмите кнопку с цифрой от 1 до 9: 10
Нажмите кнопку с цифрой от 1 до 9: 9
Лифт №1 сейчас на 1-м этаже, до вас ему ехать 7 эт.
Лифт №2 сейчас на 1-м этаже, до вас ему ехать 7 эт.
Лифт №3 сейчас на 1-м этаже, до вас ему ехать 7 эт.
К вам приедет лифт №1
Едем дальше? (да/нет) да
************** Новая поездка в лифте **************
На какой этаж вызвать лифт? 8
На какой этаж поедем? 2
Лифт №1 сейчас на 9-м этаже, до вас ему ехать 1 эт.
Лифт №2 сейчас на 1-м этаже, до вас ему ехать 7 эт.
Лифт №3 сейчас на 1-м этаже, до вас ему ехать 7 эт.
К вам приедет лифт №1
Едем дальше? (да/нет) да
************** Новая поездка в лифте **************
На какой этаж вызвать лифт? 2
На какой этаж поедем? 6
Лифт №1 сейчас на 2-м этаже, до вас ему ехать 0 эт.
Лифт №2 сейчас на 1-м этаже, до вас ему ехать 1 эт.
Лифт №3 сейчас на 1-м этаже, до вас ему ехать 1 эт.
К вам приедет лифт №1
Едем дальше? (да/нет) да
************** Новая поездка в лифте **************
На какой этаж вызвать лифт? 5
На какой этаж поедем? 7
Лифт №1 сейчас на 6-м этаже, до вас ему ехать 1 эт.
Лифт №2 сейчас на 1-м этаже, до вас ему ехать 4 эт.
Лифт №3 сейчас на 1-м этаже, до вас ему ехать 4 эт.
К вам приедет лифт №1
Едем дальше? (да/нет) да
************** Новая поездка в лифте **************
На какой этаж вызвать лифт? 2
На какой этаж поедем? 8
Лифт №1 сейчас на 7-м этаже, до вас ему ехать 5 эт.
Лифт №2 сейчас на 1-м этаже, до вас ему ехать 1 эт.
Лифт №3 сейчас на 1-м этаже, до вас ему ехать 1 эт.
К вам приедет лифт №3
Едем дальше? (да/нет) нет
Process finished with exit code 0