Показать сообщение отдельно
Старый 19.05.2016, 01:00
  #231   
Цитата:
Сообщение от Hassan-i Sabbah Посмотреть сообщение
В тюрьме содержатся 100 заключённых. Им предлагают следующее испытание:
В одной из камер расставлены в ряд 100 ящиков. В каждый из них положена бумажка с именем одного из узников, причём в разные ящики — разные имена. Заключённых по одному будут заводить в эту камеру. В камере заключённый может открывать и заглядывать в те ящики, которые хочет, но максимум он может открыть 50 ящиков из 100. Его задача в том, чтобы среди открытых им ящиков оказался тот, в котором лежит бумажка с его именем.
После этого его уведут и сразу отправят в свою камеру. Уходя, он должен оставить камеру точно в том же состоянии, в котором её нашёл. Таким образом, в процессе испытания никакого обмена информацией междузаключёнными нет.
Их выпустят, если КАЖДЫЙ из них найдёт бумажку со своим именем.
Первый зашедший в камеру заключённый может осмотреть содержимое всех ящиков и, если захочет, поменять местами любые два (и только два) из них.
Найдите стратегию, которая позволит заключённым гарантированно (со 100% вероятностью) успешно справиться с этим испытанием.
Я как программист увидела решение в применении структуры LinkedList (Java).
Пронумеровать коробки (раз они стоят в ряд то это легко) и пронумеровать заключенных привязав номер к имени. Далее по аналогии с LinkedList в Java.
Примерно так выглядит

Короче каждый начинает с коробки со своим номером, номер следующей коробки соответствует имени заключенного которое в коробке(списочек придется составить и при себе иметь, а то всех 100 не запомнишь, кроме того придется предположить что имена не повторяются), и т.д. до своего имени. Поскольку все номера уникальны и в каждом только один указатель на следующий элемент, то списки будут небольшие. А первый входящий с правом перестановки должен исключить списки длиной более 50 элементов, если таковые имеются. Могу поподробнее описать если совсем непонятно. Но лучше почитайте про LinkedList, тогда всем сразу станет ясно.