Статья Автор: Лебедев Дмитрий Алексеевич

Направленные игры c запретами на команды

Играют два игрока А и Б.  Ходы по очереди.
Правила 
  • прибавить из списка 1 
  • или умножить/разделить на число из списка 2
  • запрещается повторять команду соперника 
  • стартовые позиции - натуральные числа не превосходящие N
  • Проиграл тот,  кто не может сделать ход

 


Способ решения - метод "раскраски" BFS
  1. Определяем piA(pos, swin) - программа, определяющая для ходов игрока A:
               есть ли выход за пределы или ход в множество X
               возвращает подходящие позиции с указанием команд
  2. Определяем piA(pos) - программа, которая для ходов игрока Б. проверяет,
              что все ходы ведут в множество X:
               возвращает определившиеся позиции
  3. Определяем step(S, X, t)  -   S - множество позиций для обработки, X - множество для сравнений , t - такт хода
    возвращает множество значений и S которых "подходят" для заданного такта 
  4. Основная программа - определяет/инициализирует словари/множества для работы
  • G - Множество позиций, появление которых в игре разрешено 
    (пока совпадает с множество исследуемых вершин)
  • LW = {0:set(), 1:set()} - словарь обработанных позиций, где ключ 1 соответствует "выигрышным позициям",
    а ключ 0 "проигрышным"   
  • swin - набор параметров, определяющих игру ("правила завершения")
  • R - промежуточный результат 
  • Ans - словарь для хранения ответов (при заполнении может пересекаться с множеством "стартовых" фигур
Обработка может вестись несколько тактов, может до окончания "стартовых позиций"
При решении немного оптимизирована используемая память и быстродействие "алгоритма"
 


Печать