Как стать автором
Обновить

Мизерный ним

Время на прочтение3 мин
Количество просмотров7.5K
Здравствуйте!
Сегодня я хочу разобрать еще одну классическую задачу на комбинаторные игры — мизерный ним. Всем известно что в теории игр ним с нормальным окончанием занимает центральное место, так как к нему сводятся все комбинаторные игры с нормальным окончанием. Посмотрим как обстоят дела с модификацией привычного нима.
Вначале давайте вспомним формальное определения нима, стратегию игры и связанные с этим теоремы.
Ним — математическая игра, в которой два игрока по очереди берут предметы, разложенные на несколько кучек. За один ход может быть взято любое количество предметов (большее нуля) из одной кучки. Выигрывает игрок, взявший последний предмет.

Как же определять кто победит при оптимальной игре обеих соперников? Об этом нам говорит теорема Бутона:
Пусть имеется N кучек нима, количество камешков в каждой из них . Тогда текущая позиция проигрышная если , где — значок побитовой суммы по модулю 2 (xor). Доказательство теоремы строится на том, что из любой позиции с нулевой ним-суммой перейти можно только в позицию с ненулевой (за исключением пустых кучек), и из любой позиции с ненулевой ним-суммой всегда можно перейти в позицию с нулевой. Значит после правильной последовательности ходов игрок с ненулевой ним-суммой всегда побеждает, так как после своих ходов оставляет нулевую ним-сумму, строго уменьшая количество камней, следовательно рано или поздно именно он он заберет последние камни. Посмотрим как работает эта теорема на примере, пусть мы имеем три кучки с количеством 3, 8, 15 камней в каждой. Запишем эти числа в столбик в двоичном представлении и вычислим xor, он равен нулю, значит второй игрок, назовем его Y, находится в выигрышной позиции. Его стратегия состоит в том, чтобы любым своим ходом оставлять позицию с нулевой ним-суммой. Рассмотрим возможные ходы, где Y придерживается своей стратегии и в итоге побеждает:

Получается, стратегия игры в ним проста, еще проще можно определить победителя при оптимальной стратегии, теперь перейдем к нашей задаче мизерного нима. Правила у него те же, за исключением одного: теперь тот кто забирает последний камень проигрывает. Наша задача состоит в том чтобы определить по размерам кучек кто победит при оптимальной стратегии. На этот раз игра мизерная, значит её не всегда можно свести к ниму, у нас нет четких алгоритмов и подходов для решения этой задачи, их придется придумывать с нуля. В предложенном мною решении мы попытаемся свести мизерный ним к обычному, в данном случае это возможно, но после некоторых умозаключений.
Итак, для начала нам необходимо найти позицию, которая будет выигрышная как для мизерного нима, так и для обычного, для этого представим случай когда на столе есть K кучек единичного размера и одна кучка с размером больше одного камня. В случае если мы играем в обычный ним, я заберу из камни, оставив один или ноль так, чтобы после моего хода сопернику досталось четное количество единичных кучек, тогда я выиграю при любых стратегиях; а если мы играем в мизерный ним, то я оставлю нечетное количество кучек с одним камнем. Тем самым мы нашли позицию, в которой игрок побеждает в обеих играх. Теперь разобьем все возможные стартовые позиции на две группы:
  • На столе только единичные кучки
  • На столе есть кучки размера два и больше

Легко видеть что в первом случае чтобы выдать ответ достаточно проверить четность количества кучек. В случае четности побеждает X, в случае нечетности Y. Теперь рассмотрим второй случай. Можно заметить что оптимальная стратегия тут будет заключаться в том чтобы свести игру к указанной нами позиции с К единичными кучками и image кучкой размера больше одного, назовем эту позицию A. Причем как бы не проходила игра, позиция А будет рано или поздно достигнута одним из игроков. Кто попадет в эту позицию, тот победит, причем как в мизерном ниме, так и в обычном, а из этого следует то, что мы можем проверить начальную позицию на выигрышность, как будто бы играем в обычный ним, вычислив xor всех кучек. Если xor нулевой, то первым в позицию А попадет второй игрок, где ему ничего не будет мешать сделать выигрышный в мизерном ниме ход. Иначе этот ход достанется иксу.
Тем самым, разбив игру на два случая мы легко побеждаем нашу задачу, вот ее решение написанное на java:
Copy Source | Copy HTML
  1. int n = nextInt(), K =  0, nimSum =  0;
  2. for (int i= 0; i<n; i++) {
  3.     int size = nextInt();
  4.     if (size == 1) K++;
  5.     nimSum ^= size;
  6. }
  7. if (n - K >= 1)
  8.     out.println(nimSum ==  0 ? 'Y' : 'X');
  9. else
  10.     out.println((K&1)==1 ? 'Y' : 'X');
  11.  

Не существует общего подхода к мизерным играм, иногда они сводятся к играм с нормальным окончанием, иногда нет, тут просто нужна сообразительность и немного фантазии)
Спасибо за внимание.
Теги:
Хабы:
Всего голосов 66: ↑46 и ↓20+26
Комментарии15

Публикации