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

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

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

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

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

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

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

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

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

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

Если мы мыс­лен­но выре­жем ниж­ний корот­кий крас­ный кусок и пере­не­сём его наверх, то мож­но лег­ко заме­тить, что у нас полу­чи­лось два отрез­ка по 30 мет­ров:

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

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

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

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

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

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

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

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

a + c + d = 50

e – 30 + b = 50

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

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

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

    
language: JavaScript
var a, b, c, d, e;
 
// длина каждой стенки не может быть равна нулю, поэтому все циклы начинаются с единицы. Переменная e, судя по рисунку, явно больше 50, поэтому у неё будет другой диапазон
for (a = 1; a <= 50; a++) {
for (b = 1; b <= 50; b++) {
for (c = 1; c <= 50; c++) {
for (d = 1; d <= 50; d++) {
for (e = 1; e <= 100; e++) {
if ( (a + c + d == 50)&& (e - 30 + b == 50) ) {
console.log('a = ' + a);
console.log('b = ' + b);
console.log('c = ' + c);
console.log('d = ' + d);
console.log('e = ' + e);
// 50, 50 и 30 — уже известные нам значения длины
console.log('summ = ' + (50 + 50 + 30 + a + b + c + d + e));
console.log('---------');
}
}
}
}
}
}


Ско­пи­ро­вать код
Код ско­пи­ро­ван
Ещё по теме