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