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
38
39
40
|
Ще запазим броя етажи като глобална константа на име FLOORS (и стойност 5).
По условие е казано, че асансьор се качва по-бързо отколкото слиза. Ще допуснем, че
разликата в скоростите е малка. Допълнително се изисква да приоритизираме скорост.
От тези факти, следва че когато два бутона на еднакво разстояние от един асансьор са натиснати,
то асансьора трябва да приоритизира по-горния етаж.
Също не е казано в какъв формат ни се подават етажите на асансьорите.
Избираме следния format: от 0 до FLOORS-1 вкл. се обозначават етажите, като 0 обозначава партер.
unsigned int newElevatorPosition(bool buttonsPressed[FLOORS], unsigned int currentPosition);
Функцията newElevatorPosition ще върне новата позиция на асансьора по следния начин:
започваме от текущата позиция и с цикъл постепенно инкрементираме стойност "distance".
На всяка итерация ще проверяваме дали на съответния горен и долен етаж
(текуща позиция + distance и текуща позиция - distance) е натиснат бутон.
При всяка такава проверка, ще погледнем дали получения етаж е валиден (индекс в buttonsPressed).
Ако етажа е валиден и на него е натиснат бутон, директно връщаме етажа.
Първо правим проверката за горния етаж, след това за долния, така имплементираме решението на
проблема с двата натиснати бутона на еднакво разстояние, който анализирахме по-рано.
distance ще се мени от 0 до FLOORS-1 вкл. и ако не намерим етаж с натиснат бутон, просто връщаме
текущата позиция.
Понеже distance в началото ще е 0, това покрива случая когато бутон е натиснат на текущия етаж.
int main();
Декларираме булев масив с FLOORS на брой елемента и го попълваме с входни данни.
Декларираме и попълваме два индекса (от тип unsigned int), които ще съдържат позицията на двата
асансьора.
Извикваме newElevatorPosition, като подаваме булевия масив и текущата позиция на първия асансьор.
Върнатия резултат го изкарваме на екрана и на същата позиция в булевия масив, записваме че бутона
не е натиснат.
Аналогично, отново извикваме newElevatorPosition, с (обновения) булев масив и позицията на втория
асансьор. Резултата го изкарваме.
|