Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование с нуля - это совсем просто! 18) Задачи и решения


Информационный Канал Subscribe.Ru

 
Школа программирования

Программирование с нуля - это совсем просто!

18) Задачи и решения

Привет еще раз! :)

Ответы на задачку с 49 жилами. Начнем с конца.

48 ходок

Ответ: Реку надо переплыть 48 раз.
Решение:
1. Берег №1. Источник. Подключить источник к любому проводу и пометить этот провод биркой 1. Помечено 0 проводов. Реку переплыл 0 раз.
2. Берег №2. Найти с помощью пробника проводник под напряжением и пометить как №1. Соединить провод №1 с любым непомеченным проводом, который пометить как №2. Помечен 1 провод. Реку переплыл 1 раз.
3. Берег №1. Найти среди не помеченных проводов провод под напряжением и пометить его как №2. Подсоединить источник к непомеченному проводу и пометить этот провод как №3. 2 провода/2 раза.
4. Берег №2. Отсоединить провода №1 и №2. Найти и пометить номер 3. Соединить номер 3 с номером 4. 3 провода/3 раза.
------------------------------------------------------------------
48. Берег №2. Отсоединить провода №45 и №46. Найти проводник под напряжением, пометить как №47, соединить его с любым из двух оставшихся. Соединенный будет №48, оставшийся - №49. 47/47
49. Берег №1. Провод под напряжением - №48, последний - №49. 49/48
-- Артём

32 ходки

Скорее всего 48 раз если соединять провода по одному на доступной стороне кабеля после проверки пробником последняя жила находится методом исключения.
Но можно умудрится и за 32 раза, если сразу подключать по две жилы на батарею, а на другом конце одну из жил соединить с третьей жилой.В итоге мы за 2 проезда определяем 3 жилы последняя жила так-же находится методом исключения. Но если пробник ловит + и - то результат в два раза меньше т.е. 16раз, ведь на любой батарее есть плюсовой и минусовой выход.
Дима

16 ходок

Я думаю, что можно за 16 поездок.
Первые 7 + 1 обратная, нужно:
-связать (соединить провод с проводом) пучками по 7 штук, получится 7 пучков;
-к любому пучку подключаем батарею и вешаем пачку бирок №№ 1-7;
- на том берегу собираем обратный пучок с бирками №№ 1-7 и соединяем пучок с произвольным и даем №№ 8-14;
-на другом берегу вычисляем пучок №№ 8-14 и соединяем с произвольным, которому даем №№ 15-21 и т.д.
-разрываем связку между пучками.
Вторые 7 + 1 обратная, нужно:
- маркировать в пучках провода №1 и соединить их вместе на батарею;
- перехать на тот берег, найти семь номеров №1 и связать с семью произвольно выбранными №2, вообщем все как и с пачками.
Итого 16 поездок.
Алексей

10 ходок

первые задания были сравнительно легкими, поэтому писать не стал, но вот задача с электриком на берегу реки...
Задела меня за живое... Два вечера потратил на ее решение.
Мой вариант: 10 раз
1. Цепляем бирку 25 на один провод и подсоединяем его к батарее. Остальные жилы замыкаем попарно. (24 по 2). Плывем
2. Определяем 25 провод на берегу Б. С помощью этого же провода определяем пары, замкнутые на стороне А. Делаем им перехлест. Далее вяжем узелки на одном из проводов в полученных парах и запитываем их от 25 жилы. Второй провод будет дополнением к первому (49 для 1, 48 для 2 ... сумма = 50, назовем их смежными) (Всего 24 1-узелковые жилки) Плывем
3. Находим узловые на стороне А и тоже вяжем узелки. Размыкаем. Далее аналогично, среди узелковых проводов вяжем пары (12 по 4) Плывем
4. Определяем четверки, Вяжем 2- узелки и запитываем ( 12 двухузловых и 12 одноузловых) Плывем
5. На стороне А находим 2-узловые нитки (12 штук) и связываем в 6 косичек по 8 жил Плывем
6. На стороне Б Вяжем 3 узелки и запитываем (6 3узл, 6 2узл, 12 1узл) Плывем
7. Находим 6 3узл нити, вяжем их попарно в 3 жгута по 16 жил Плывем
8. На стороне Б Вяжем 4 узелковые и запитываем их (3 4узл, 3 3узл, 6 2узл, 12 1узл, 24 пустых) Плывем
9. Находим 3 4узл жилки. Две из них соединяем, а на третью вешаем бирку 1 (и на смежный провод бирку 49) Плывем
10. На стороне Б находим пустую 4 узелковую, вешаем ей 1 номер, на смежную - 49. Вяжем и запитываем 1 5узл. Вешаем на не 2 и на смежную 48. Одну 4узл оставляем пустой, вешая на нее 3 и на смежную 47. Получили 3 жгута по 16 жил. Вешаем все бирки на стороне Б
В первом жгуте 1-8, 49-42,
во втором - 9-16, 41-34,
в третьем - 17-24, 33-26
Плывем
11. На стороне А находим 5узл Вяжем ей 2 и смежной 48, второй 4узл - 3 и 47. Мы определили три жгута. Вешаем все бирки.
Ф-у-у-х!
Юрий

7 ходок

Я думаю, можно переплыть реку 7 раз, т.е. если провода соединены строгим квадратом, то можно батарею присоединять, группируя каждый ряд - сначала 7 проводов 1 ряда, затем 7 проводов 2 ряда и т.д.
....... - 1 ряд
....... - 2 ряд
.......
.......
.......
.......
....... - 7 ряд.
В случае, если провода расположены вкруговую, то можно правильно присоединить не более 2-3 проводов.
Карыгаш.

6 ходок

Еще предоставляю на Ваш суд решение задачи про электрика=)
"классического варианта" я не знаю, пришлось придумывать свой=)
Идея притерпевала эвалюцию=) в первом варианте решения получалось 25 ходов, а во втором я обошлась всего 6=)
Система какая:
все 49 проводов делим на 2 части: в одной - 25, в другой - 24;
первую часть подсоединяем к батарее и все 25 проводов нумеруем от 1 до 25;
вторую часть нумеруем от 26 до 49;
Проверяем провода на другой стороне реки - те, на которых лампочка светится нумеруем от 1 до 25, на которых не светится - от 26 до 49;
//это был ход номер раз=)
Возвращаемся обратно, отсоединяем от батареи провода с 14 по 25 и подсоединяем провода с 26 по 37;
Идем на другой берег и совершенно точно узнаем какие провода 1-13, 14-25, 26-37, 38-49;
//это был ход номер два
Возвращаемся обратно, и точно так же определяем 1-7, 8-13, 14-19, 20-25, 26-31, 32-37, 38-43, 44-49;
//это был ход номер три
Аналогично определяем 1-4, 5-7, 8-10, 11-13, 14-16, 17-19,...,44-46, 47-49;
//это был ход номер четыре
Итак, теперь мы имеем 16 разделений проводов, в одном из них 4 провода, в остальных по 3
А для того чтобы определить точные номера и трех и четырех проводов достаточно сделать два хода:
Итого 6 ходов=)
Не знаю, может быть не совсем понятно обяснила=) но в моем представлении все нормально реализовывается=)
Таня

5 ходок

за одну ходку туда-сюда можно определить не один, а два провода - подключаем напряжение и вешаем очередную бирку на 1 провод, переплываем, находим, вешаем такую же бирку; соединяем с любым непомеченным проводом, заодно метим его следующей биркой; переплываем обратно и находим, где напряжение, вешаем бирку - итого 2 провода найдено. Подключаем источник к следующему "непомеченному" - и повторяем. Итого за 24 ходки туда-сюда определяем 48 проводов, 49-й тоже таким образом определится, специально плавать не надо, бирку на той стороне можно было повесить в последний раз на той стороне реки на оставшийся "не у дел" провод.
Но вот что интересно - если бы у нас кроме бирок была бы изолента разных цветов, то можно было бы:
1) собрать 24 провода под одну изоленту (условно назовём их чётными), подключить их к источнику, сплавать на другой берег, найти их все, тоже собрать под такую же изоленту, подключить к ещё 24-м проводам, оставшийся пометить номером 49 :)
приехать обратно, найти в оставшихся тот, который "не контачит", тоже отметить 49-м; остальные 24 назовём нечётными (название роли не играет), далее повторить алгоритм из первого решения, но подключать одновременно провод из "чётной" и "нечётной" кучи, то количество ходок уменьшится вдвое - следовательно, будет 1+12=13 ходок.
2) развивая эту идею, имея возможность помечать разные "кучки" проводов, мы можем вместо оставшихся 12 ходок "уполовинить" каждую из связанных в п.1) - опять же, соединяя по 12 проводов из "чётной" и "нечётной" связки (их можно обрабатывать одновременно, т.к. ясно, что из одной связки в другую провода сами не перелезут), таким образом за две ходки будет 4 кучки по 12 проводов и 49-й отдельно.
3) 8 связок по 6 проводов и 49-й провод
4) 16 связок по 3 провода и 49-й провод
5) из каждой тройки проводов за одну ходку определяем их все три - два подключаем, как в первоначальном решении, а третий-лишний определится сам...
Итого - 5 ходок... Только, скажу честно, на практике я такое решение применял бы очень в крайнем случае, т.к. запутался бы :)
Если речка неширокая, быстрее было бы сплавать 24 раза, как в первом решении...
Алексей.

4 ходки

По моему решению для решения поставленной задачи надо переплыть реку 4 раза. Пошагово:
0) На месте (на одной стороне реки). Присоединить батарею к любому проводу и обозначить его первым. Остальные провода соединить попарно - получится 24 пары.
1) Переплыть реку. Там присоединяя пробник с лампочкой поочерёдно ко всем проводам, находим провод №1. Обозначили его. Далее присоединяем этот пробник с лампочкой к любому др. проводу, а провод №1 поочерёдно соединяем то с одним, то с другим проводом, пока не загорится лампочка. Это будет означать, что мы нашли пару проводов, которая соединена между собой на той стороне реки. Тогда провод, к которому присоединён пробник с лампочкой - будет проводом №3, а провод, к которому присоединили провод №1 - проводом №2. Далее лампочку присоединяем к любому другому проводу (из оставшихся непронумерованных), при этом провода №1 и №2 оставляем соединёнными. По описанному же механизму определяем провод 4 и 5, 6 и 7 и так далее. В итоге, будут пронумерованы все провода на этой стороне реки. На проводе 49 - лампочка. Провода соединены попарно (1 со 2, 3 с 4, 5 с 6 и т.д.). После этого отсоединяем пробник с лампочкой и переплываем реку на др. берег.
2) Отсоединяем от провода №1 батарею и присоединяем туда пробник с лампочкой.
3) Снова на тот берег. Там к последнему свободнооканчивающемуся проводу №49 присоединяем батарею. Обратно переплываем реку. 4) Теперь необходимо идентифицировать все пары: какие у них номера (проставленные на том берегу)? В данный момент все провода соединены в единую цепь, которая начинается с батареи, присоединённой к проводу №49 на том берегу реки, и оканчивается пробником с лампочкой, присоединённой к проводу №1, на этом берегу реки.
Разъединяем любую пару проводов, берём пробник с лампочкой (отсоединили его от провода №1 - он там больше не нужен) и присоединяем к к.-л. проводу разъединённой пары.
Несложно догадаться, что при присоединении к одному из этих проводов лампочка загорится, а при присоединении к другому от этой пары - нет. Тогда тот провод, на котором лампочка загорится, будет иметь номер N, а второй - (N-1).
N определяем следующим образом. Оставляем эту пару проводов разъединённой (это единственный разрыв в цепи) и смотрим, сколько пар из оставшихся 23-ёх находятся под напряжением ,т.е. на участке цепи между разрывом и батареей. Это определяется легко: разрывается пара проводов, присоединяется лампочка к одному, потом к другому проводу; если лампочка загорается при присоединении к одному их них - эта пара проводов находится на указанном участке (назовём такие пары "рабочими"). Если лампочка не загорается ни от одного из двух проводов пары - эти провода находятся на обесточенном участке (между проводом №1 и разрывом). Потом пара соединяется обратно - её в сторону, чтобы не смешать с другими ещё не проанализированными, - и смотрится следующая. Так мы определяем число "работающих пар" при данном разрыве цепи. Несложно взять кусочек бумажки и составить на нём матрицу соответствия числа "работающих" пар проводов (Х) номерам проводов в паре (N и N-1), где сделали разрыв:
если Х=0 (вся цепь обесточена) -> N=49, N-1=48 (пара проводов №49-№48)
Х=1 -> N=47, N-1=46
... ...
X=23 -> N=3, N-1=2
В общем виде можно представить формулой: N=49-2*X
Таким образом, сравнили число "работающих" пар проводов с составленной матрицей, в результате идентифицировали номера взятой пары, навесили на них бирки. Соединили проанализированную пару обратно. После первой проведённой такой операции мы имеем всё тот же провод №1 плюс ещё два провода с известными теперь номерами.
По такому алгоритму определяются номера всех проводов.
P.S.: но для того, чтобы навести окончательный порядок (разъединить все соединённые доселе провода, да и батарею забрать), надо будет ещё смотаться туда-обратно через реку => +2 поездки (итого 6).
Получилось довольно запутанное объяснение. В голове-то решение появилось чётко, понятно и быстро. Всё-таки в уме задачи решаются значительно легче, нежели на бумаге (экране монитора).
Диана

2 ходки

Я считаю,что достаточно будет съездить на тот берег 2 раза.Попробую обосновать это.
1).Организуем из проводников 2 группы, одна с нечетными номерами,вторая с четными, все-равно,какие провода выделить.Проделаем операцию с нечетными номерами,а с четными точно также,но позже.Итак,соединим выбранные нечетные провода между собой.У нас должно получиться 12 пар,плюс 1-пусть он будет у нас под номером 1,его мы присоединим к батарее.Теперь отправимся на другой берег.
2).Теперь,при помощи пробника находим наш номер 1.После этого,находим наши проводники, которые связаны между собой и,следовательно, являются нечетными номерами.Находим при помощи номера 1,тоесть,соединяем номер 1 со всеми проводниками и при помощи пробника ищем концы с потенциалом,соответственно, их должно оказаться 12 пар.
3).Теперь начинается самая трудоемкая часть. Соединяем между собой проводники теперь на этом конце, таким образом,чтобы все проводники наши нечетные,оказались соеденены между собой последовательно и конечно с нашим номером 1.В случае,если у нас остался 1 конец: а).свободным,без перемычки б).на нем есть потенциал и в).все наши нечетные номера соеденены, то это номер 49.
Затем находим его "напарника" номер 47,путем отсоединения его от остальных проводников.Когда на номере 49 потенциал исчезнет,проводник,к которому подводился ток,номер 47,соответственно,от которого- будет номер 45.Таким же образом,находим остальные номера.
4).Теперь переправляемся обратно,на тот берег,где стоит батарея. Алгоритм повторяется.Например,ищем номер 3.При отсоединении 1 перемычки у нас с потенциалом окажется один проводник,это и будет номер 3.Соответственно, тот проводник с которым он соединялся будет номер 5,а он в свою очередь соединяется с 7 и т.д.
5).Таким образом, мы нашли нечетные номера,повесили бирочки,убрали перемычечки,проделали п.1 для теперь четных номеров,и на другой берег снова, там убрали оставшиеся перемычечки и таким же образом поступаем дальше для четных номеров.
Константин.

Еще:

1. Соединяем на одном берегу жилы кабеля попарно, получается 24 пары, а к последнему проводу подключаем батарею. Пары помечаем буквами.
2. Переправляемся через реку. Соединяем все жилы в цепь, начиная от провода под напряжением, провода маркируем.
3. Возвращаемся к батарее и размыкая и замыкая цепь находим провод, непосредственно соединенный на другом берегу с проводом под напряжением, помечаем его и тд., провода маркируем.
Таким обтазом реку пришлось пересечь дважды.
Борис

И наконец - гряньте, трубы, во славу! - правильный ответ.

решение составит 1 (Один) раз туда и обратно
решение следующее подключаем источник к одному из проводов (Любому) и вешаем на него бирку "1" и оставляем этот комплект бирок на этом берегу, связываем попарно все оставшиеся провода.
Берём пробник и второй комплект бирок и переплываем на другой берег 1.а. Ищем провод с напряжением когда находим вешаем бирку с номером "1" или (N).
2.а. Вешаем бирку на провод и подключам к найденному с номером "2" (N+1). в результате имеем скоммутированную цепь 1-2 или [N-(n+1)]
3.а. Берем бирку с номером N+2. и переходим к пункту 1.а.
После того как мы скомутировали цепь и повесили все бирки мы имеем кабель подключенный в цепь, т.е. все провода подключенны друг к другу и мы имеем напряжение на всех проводах начиная с 1 и кончая 49.
Берём пробник и садимся в лодку для того что-бы переплыть обратно. после того как переплыли берем оставшиеся бирки и делем следующее
1.б. Разрывам любую пару (без бирок :) )и ишеи пропадает ли напряжение на оставшихся неопознаных проводах если нет то вешаем бирку 49 (опять N). Иначе замыкаем обратно (нужно для дальнейшего определения)
2.б. На парный к разорванному проводу вешаем соответственно бирку 48 (N-1).
3.б. Берём бирку 47 (N-2) и переходим к пункту 1.б.
По окончании мы будем иметь полностью пронумерованный кабель. И для данного алгоритма абслолютно неважно колличество проводов в кабеле будь оно хоть чётным хоть не чётным (в случае с чётным колличеством у нас будет один не задействованный провод и он найдёться одновреммено с 1 проводом кабеле, кому интересно могут сами прикинуть как это можно осущестить).
Но ниболее эффективны будер работа 2 электриков и не только с одним пробником, а с омметром и МегОметром для того чтобы данный кабель можно было бы здать в безопасную эксплуатацию.
Art

Проблема с решением таких задач в том, что они должны быть очень четко сформулированы. Видели бы вы оригинальный текст, который я долго правил :) И все равно до совершенства далеко... Так и при общении разработчика с заказчиком - что он на самом деле пытается сказать :) понять очень трудно. Так и будешь переписывать программу 49 раз, пока не поймешь, что если бы он уточнил вот это и вот это, то все вышло бы гораздо быстрее.

Следующее задание. Описанное Art-ом решение замечательно, но придется долго возиться с каждой парой, искать, где пропало напряжение. Вопрос - а можно ли еще быстрее? Подсказка - активнее задействуем свободный набор бирок :)

Данная задача очевидно обобщается на любое нечетное число проводов. А как быть, если проводов - четное число?


(c) 2004 Сергей Бобровский bobrovsky@russianenterprisesolutions.com

Школа программирования с нуля
http://russianenterprisesolutions.com/sbo/

Все предыдущие выпуски базового курса тут:
http://russianenterprisesolutions.com/sbo/base.htm

А перекачать их одним архивом можно отсюда:
http://russianenterprisesolutions.com/sbo/download/sbo.zip (610 кб)
(вместе с картинками, только они в тексте с абсолютными адресами; вручную просматривать придется).

 

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.prognull
Отписаться

В избранное