Найти тему
Журнал «Код»

Задача про охрану периметра

Оглавление

Реша­ем тре­мя спо­со­ба­ми: как мате­ма­тик, инже­нер и про­грам­мист.

На одном сек­рет­ном объ­ек­те у началь­ни­ка охра­ны была зада­ча: уста­но­вить по пери­мет­ру высо­ко­вольт­ный забор, что­бы никто не про­брал­ся внутрь. Но объ­ект был настоль­ко сек­рет­ным, что даже дли­на забо­ра на всех участ­ках оста­ва­лась тай­ной. Всё, что было у началь­ни­ка охра­ны, — это вот такая схе­ма.

Как началь­ни­ку охра­ны вычис­лить пери­метр объ­ек­та и воз­мож­но ли такое в прин­ци­пе с таки­ми непол­ны­ми дан­ны­ми? У этой зада­чи три реше­ния, и если не хоти­те про­бо­вать сами — читай­те наше.

-2

Решаем как математик

На самом деле все дан­ные для реше­ния у нас уже есть — того, что на рисун­ке, вполне доста­точ­но.

Сна­ча­ла нахо­дим дли­ну пра­вой стен­ки — она рав­на длине левой:

Из рисун­ка вид­но, что Х = 50, а зна­чит и дли­на пра­вой стен­ки тоже 50 мет­ров.
Из рисун­ка вид­но, что Х = 50, а зна­чит и дли­на пра­вой стен­ки тоже 50 мет­ров.

Из рисун­ка вид­но, что Х = 50, а зна­чит и дли­на пра­вой стен­ки тоже 50 мет­ров.

Теперь посчи­та­ем общую дли­ну ниж­ней стен­ки и двух стен в выре­зе. Нач­нём с ниж­ней:

-4

Полу­ча­ет­ся, что дли­на ниж­них стен забо­ра будет рав­на 50 + (30 × 2) = 110 мет­ров.

Тогда общий пери­метр будет равен: 50 (извест­но) + 50 (извест­но) + 50 (пра­вая стен­ка) + 110 (ниж­ние стен­ки) = 260 мет­ров. Зада­ча реше­на!

Решаем как инженер

Что­бы решить зада­чу инже­нер­ным мето­дом, нам пона­до­бит­ся рулет­ка и допуск началь­ства для обхо­да пери­мет­ра (объ­ект же сек­рет­ный). Как толь­ко полу­чи­ли и то и дру­гое — берём рулет­ку и изме­ря­ем те сте­ны, дли­на кото­рых нам неиз­вест­на. Как толь­ко изме­ри­ли — скла­ды­ва­ем резуль­тат и полу­ча­ем нуж­ную дли­ну.

Ино­гда мож­но про­сто взять и изме­рить 🙂

Веро­ят­но, изна­чаль­но выдан­ный нам план неточ­ный, и толь­ко пря­мое изме­ре­ние даст досто­вер­ный резуль­тат.

Решаем как программист

Обо­зна­чим все дли­ны, кото­рые нам неиз­вест­ны:

-5

Вот пра­ви­ла, по кото­рым мы будем про­ве­рять, соот­вет­ству­ет ли наше реше­ние исход­ным дан­ным:

a + c + d = 50

e – 30 + b = 50

Най­дём эти зна­че­ния и весь пери­метр мето­дом пол­но­го пере­бо­ра: про­ве­рим в цик­лах все зна­че­ния, и если они подой­дут под наши усло­вия — выво­дим резуль­тат. Если резуль­та­тов будет несколь­ко — выве­дем все, пусть даль­ше с ними раз­би­ра­ет­ся началь­ник охра­ны.

Исхо­дя из рисун­ка, пусть наши пере­мен­ные не будут боль­ше 50 — это­го хва­тит, что­бы пере­брать все доступ­ные зна­че­ния.

Вот код на JavaScript, про­стой и рабо­чий. Вы уди­ви­тесь, как мно­го вари­ан­тов он най­дёт: