Статья Автор: Лебедев Дмитрий

TUZ_2-14 Вычисление площади прямоугольных башен Манхэттена на линии горизонта

TUZ_2-14 Вычисление площади прямоугольных башен Манхэттена на линии горизонта

TUZ_2-14 Вычисление площади прямоугольных башен Манхэттена на линии горизонта
2.14 Вычисление площади прямоугольных башен Манхэттена на линии горизонта
Есть список прямоугольных башен в виде (s, e, h), где s, e и h – это начало и конец на оси X и высота соответственно.
Ваша задача: написать функцию, которая принимает кортеж (s, e, h) и возвращает площадь прямоугольных башен.
Обратите внимание, что общая площадь башен не должна вычисляться дважды.
В табл. 2.14 показаны ожидаемые результаты для некоторых входных данных.
Таблица 2.14. Некоторые ожидаемые результаты для задачи вычисления площади прямоугольных башен Манхэттена на линии горизонта
Towers Ожидаемый результат
(2, 6, 98), (1, 0, 9) 383
(3, 7, 1) 4
(-8, 6, 3), (6, 14, 11), (0, 4, -5) 130
(2, 550, 222), (1, 0, 4) 121652

Примечание. Линия горизонта - это линия нулевого уровня. Высота башни указывает, насколько её вершина выше линии горизонат.
Отрицательное значение высоты означает, что башня ниже линии горизонта и не видна. 

Алгоритм
.Для вычисления площади данных башен используются два алгоритма: divide и Manhattan_Skyline.
Алгоритм divide выполняет следующие шаги.
1. Принимает два параметра: start и end. Если start равно end, то возвращается список, содержащий два элемента:
[towers [start] [0],towers [start] [2]] и [towers [start] [1],0].
2. В противном случае вычисляется средняя точка между началом и концом и алгоритм рекурсивно вызывается для левой и правой половин списка башен. Затем результаты для левой и правой половин объединяются в новый список.
На этом шаге выполняются следующие действия: • вычисляется средняя позиция;
• создается пустой список merged и инициализируются нулем две переменные i и j;
• инициализируются значением None две переменные h1 и h2;
• в цикле выполняется обход элементов списка merged по диапазону len (left) + len (right);
• если значение i больше или равно длине списка left, то в merged добавляется список, содержащий
[right [j] [0], right [j] [1] if h1 is None else max (h1, right [j] [1])],
затем j увеличивается на 1 и цикл продолжается;
• если значение j больше или равно длине списка right, то в merged добавляется список, содержащий
[left [i] [0], left [i] [1] if  h2 is None else max (h2, left [i] [1])],
затем i увеличивается на 1 и цикл продолжается;
• если координата X i-го элемента в left меньше или равна коор- динате X j-го элемента, то в merged добавляется список, содержащий
[left [i] [0], left [i] [1] if h2 is None else max (h2, left[i] [1])],
затем переменной h1 присваивается координата Y i-го элемента в left и i увеличивается на 1;
• в противном случае в merged добавляется список
[right [j] [0], right [j] [1] if h1 is None else max (h1, right [j] [1])],
затем переменной h2 присваивается координата Y j-го элемента в right и j увеличивается на 1.
3. В завершение возвращается объединенный список merged.

Алгоритм Manhattan_Skyline выполняет следующие шаги.
1. Принимает список башен towers.
2. Вычисляет площадь, ограниченную линией горизонта, с использованием divide.
3. Возвращает вычисленную площадь.


Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать