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

Направленные игры без запретов

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

 


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


Печать