Задача про циклический поезд

Есть поезд, состоящий из некоторого количества вагонов. Вы находитесь в одном из них. Это очень странный поезд, потому что его вагоны сцеплены в кольцо. В каждом вагоне есть лампочка, которую вы можете включать и выключать. Ваша задача заключается в том, чтобы определить количество вагонов в поезде. Опишите алгоритм решения этой задачи.

Других людей и прочих живых или неживых существ в поезде нет. Лампочки нельзя выкручивать, они не перегорают и не нагреваются, рисовать на стенах мелом нельзя, окон у вагонов нет. В общем, состояние поезда — это только лампочки. Кстати, начальное состояние поезда неизвестно, то есть изначально какие-то лампочки могут гореть, а какие-то не гореть. Единственный способ узнать, горит ли лампочка в определенном вагоне — это войти в него и посмотреть.

Ответ: 1. Включаем свет в первом вагоне, если он еще не включен.
2. Идем по вагонам вперед, считая N = количество пройденных вагонов (первый не в счет), до тех пор, пока не войдем в очередной вагон с включенным светом. Поскольку поезд циклический, рано или поздно это случится.
3. Выключаем свет и идем на N вагонов назад.
4. Если по возвращению в начальный вагон свет оказывается выключенным, значит мы нашли ответ — в поезде N вагонов.
5. Перейти к шагу 2.

Ваша оценка: Нет Средняя: 3.5 (147 оценки)


Комментарии

Ещё можно построить аналогичный алгортм решения, если первый вагон оставить с включённым светом.

Хорошая задача. Мне кажется, её можно задавать на собеседовании на работу для проверки логического мышления.

*с ВЫКЛЮЧЕННЫМ светом

Привет Всем ,

Правильно

А вообще-то, если заранее будет известно ,

Вкл. И выкл. Какой из них больше, 

Стоило начат именно с этого состояния,

Если ночь ,то стоит начать с ВКЛ.

Будет удобно, если светло , то можно начать с ВЫКЛ. Хотя бы энеркию сбережём,

А так всё верно и однозначно

Спасибо

Верно, эта задача как раз из тех, что задают на собеседовании в некоторых конторах

Задачи на собеседовании в конторах обычно задают не ради получения ответа, а чтобы понаблюдать, каким образом претендент станет его искать. Уже одно это наводит на мысль, что  точного алгоритма решения у этой задачи попросту нет.

А в придачу - давайте проверим качество алгоритма, выбранного в качестве ответа. На тестах, как и положено проверять алгоритмы.

Тест 1: поезд состоит из одного вагона, изогнутого кольцом. Тест корректен? Да. Ни форма, ни количество вагонов в поезде ничем не ограничены. Алгоритм работоспособен? Нет. Сбой уже после шага 1. Нет направлений "вперёд"-"назад" и выйти из вагона некуда. Претендент "провалил" собеседование.

Тест 2: количество вагонов более одного. Для начала рассмотрим случай хотя бы четырёх вагонов. Тест корректен? Да.  Алгоритм работоспособен? Да.  Алгоритм оптимален? Нет. Из первого вагона мы вышли во второй, погасили там свет; вернулись в первый вагон - там погасили свет; и через второй вагон отправились в третий вагон - точно зная, что нам предстоит пройти не менее одного вагона, где свет не горит. Когда погасим свет в третьем вагоне и повернём назад - будем точно знать, что нас ждёт путь как минимум через два вагона с выключенным светом. Итак, при решении задачи мы впустую ходили через три вагона, заранее зная, что мы в них уже были, и что лампочки в них не горят. А как же постановка задачи "Единственный способ узнать, горит ли лампочка в определенном вагоне — это войти в него и посмотреть" ? Претендент решает задачу неэффективно.

Тест 3: количество N вагонов в поезде достаточно велико. Действие алгоритма ведёт к тому, что  общее количество этих вагонов с погашенным светом, через которые мы будем бегать туда-сюда, составит  [ (N-1)*(N-2)/2 ]  И с ростом N это число растёт пропорционально квадрату N . Например, при N=1000 будет уже почти полмиллиона вагонов, через которые мы ходим впустую взад-перёд, прекрасно зная, что свет в них погашен. Ресурсы, требуемые на решение задачи по этому алгоритму очень быстро превысят и физические возможности претендента, и запас времени на решение задачи. Будет ли задача решена или алгоритм ведёт к напрасной трате ресурсов?  Претенденту обещают перезвонить, когда его алгоритм подсчёта даст реальный результат.

И замечание 4. В задаче ДВА объекта: "поезд" и "Вы".  Для объекта "поезд" есть множество ограничений. Для объекта "Вы" ограничение единственное: "Вы находитесь в одном из вагонов поезда". Для подсчёта количества вагонов в поезде от "Вас" формально требуется всего лишь пометить один любой вагон так, чтобы покидая его и возвращаясь "Вы" всегда могли определить, что это тот самый помеченный вагон. Ограничения на способ пометки имеются? Никаких! Можете оставить под лампой свой левый ботинок и обойти поезд по кругу босиком, зато всего один раз. Интервьюер говорит, что пол в поезде засыпан битым стеклом? Без ботинок там ходить нельзя? Тогда бросьте под лампой свой носовой платок и шагайте в ботинках! Интервьюер уточняет, что платок у вас отобрали перед посадкой в поезд? Ладно, бросьте там свои трусы! В поезде всё равно никто вас не видит. Быстренько совершите одно круговое турне - подберёте и снова наденете. Ах, трусы у вас тоже отобрали? Безобразие! Смачно плюньте прямо под лампой и отправляйтесь в путь в одних ботинках. Что,и плеваться здесь тоже нельзя? И гадить? Ну-ну! Похоже, в этой конторе привыкли ставить задачу путём многократных дополнений и уточнений уже после того, как алгоритм реализован! Претендент задумывается, надо ли ему руководство, которое не может сразу внятно поставить задачу и чётко изложить вводные условия. Это, знаете ли, сущий ад: работь под тем, у кого каша в голове. И когда из-за этого все дедлайны полетят к чёрту - самому же оказаться виноватым. Претендент задумывается дважды: не поискать ли ему другую, более вменяемую контору.

А как же алгоритм решения задачи? Да тут всё просто: пусть вагоны пересчитает сам составитель задачи про поезд - и мир сразу увидит, какой алгоритм он считает наиболее подходящим.