TGViewer
Грокаем C++ Грокаем C++ @grokaemcpp · 9.35K subscribers
Post #296 3.63K
Решение задачи с мудрецами

Давайте для начала решим, кто из колонны мудрецов будет иметь самую большую осведомленность о цветах всех шляп мудрецов. Очевидно, что последний в колонне может видеть всех остальных мудрецов и их шляпы. И так как он знает все цвета, кроме своего, то он может эту информацию передать дальше. Следующий по осведомленности идет мудрец, стоящий сразу перед последним. Он видит всех, кроме себя и позади стоящего. Рассуждая такой логикой мы имеем ситуацию, когда больше всего информации об обстановке у последнего в шеренге, а меньше всего - у первого. Так давайте же назначим порядок ответов мудрецом в соответствии с убыванием количества знаний об обстановке. То есть сначала отвечает самый последний мыслитель, у которого сзади никого нет, затем предпоследний и так далее до первого.

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

И такая стратегия есть)

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

После этого следующий мудрец будет знать четность количества белых шляп всех впереди стоящих мыслителей(он их видит) и общую четность белых шляп включая его собственную. Сопоставляя эти четности он четко сможет понять какая у него шляпа и даст правильный ответ.

И все последующие мудрецы на основе ответов своих предыдущих коллег смогут дать правильный ответ. Приведу сразу пример для наглядности.

Рассмотрим колонну из 5 мудрецов. Для большей длины все будет аналогично. Б - мудрец с белой шляпой, Ч - с черной. Поставили их вот так:
1 2 3 4 5
Б<-Ч<-Ч<-Б<-Ч

Справа - последний, он видит четверых предыдущих. Слева первый, который никого не видит.

Последний сосчитал количество белых шляп впереди - 2. 2 - четное число, поэтому он говорит, что у него белая шляпа. Ему отрубают голову(R.I.P).

4-ый знает, что когда последний говорит белая, значит впереди него четное число белых шляп. Он смотрит вперед и видит всего одну шляпу. Это нечетное число. Получается, что четность белых шляп изменилась, а значит у него самого белая шляпа. Он дает правильный ответ.

3-ий знает, что на предыдущем мудреце четность количества белых шляп изменилась. Значит у трех мудрецов, включая его, нечетное их количество. Он видит перед собой одну белую, понимает, что четность не поменялась и говорит "черная". И это правильный ответ!

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

1-ый знает, что белых шляп все еще нечетное число, поэтому говорит: "белая". И оказывается в стане спасенных.

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

Тут есть интересный edge case. Если нет ни одной белой шляпы среди 19-ти впереди стоящих мудрецов, последний должен сказать "белая". То есть посчитать ноль четным числом. Тогда следующий не увидит перед собой белых шляп, но будет знать, что их должно быть четное количество. И единственный вариант, когда это возможно - впереди последнего были все черные шляпы.

Такая задачка. Делитесь эмоциями от ее решения в комментах. И не скупитесь на лайки!

Solve your problems. Stay cool.
  • 🔥 29
  • 👍 11
  • ❤ 9
  • ❤‍🔥 2
  • ⚡ 1
  • 🤩 1
More from @grokaemcpp
  1. Oct 14, 2026​​Что внутри std::condition_variable? #опытным Более менее все знакомы с примитивом синхро…
  2. Oct 12, 2026​​WAT #новичкам Как вы думаете, результат выражения: bool math = -1 < 1U; будет правдой ил…
  3. Oct 8, 2026​​Strict weak ordering #опытным На первый взгляд, всё выглядит рабочим: мы создаём 40 зака…
  4. Oct 7, 2026​​Где-то баг... #опытным Вот вам код: struct Order { int price; int id; }; int main() { st…
  5. Oct 5, 2026Откуда spurious wakeup на кондваре? #опытным У кондваров есть метод std::condition_variabl…
  6. Oct 1, 2026​​Stacktrace. Tips #опытным Чтобы полноценно работать со стандартными трейсами, нужно знат…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →