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

Создаем программу для игровой стратегии. Часть 3

Эта статья является продолжением  статьи 49906 и статьи 49931 в которых было показано как создавать программу построения выигрышной стратегии (ВС) по аналогии с "ручными" действиями. Продолжим данную тему и попытаемся создать "компактную" программу для решения поставленной задачи.
Новая версия программы вместо двух подпрограмм (first и second) будет иметь один стандартный блок и две программы настройки (start и next). 
Результатом работы программы будет "словарь раскраски" вершин "графа игры". Принцип раскраски сохраняется.
Уточним основные понятия.
  • правила игры - определяются условиями задания
  • вершины графа - возможные состояния в игре. Будем подразделять на:
    > стартовые - те, из которых игра может начинаться
    > финальные - те, в которых игра завершается. Часть "финальных" вершин объявляется "победными для игрока попавшего в них", а часть
    "проигрышными для игрок попавшего в них". Если правила игры позволяют, то будем считать, что финальных вершин всего две:
       'W' -выигрышная и 'L' - проигрышная;
  • словарь раскраски Dict - словарь, ключи=вершине/состоянию графа, а значение =цвету раскраски (целое число).
    Начальное заполнение: Dict('W')=0; Dict('L')=-1
Построить выигрышную стратегию (ВС) - это значит раскрасить вершины графа в два цвета (чётные и нечётные) и построить двудольный граф так,
чтобы из вершин с чётной раскраской  "все возможные ходы" вели в вершины с нечётной раскраской, а  из вершин с нечётной раскраской был ход
в вершину с чётной раскраской. Вершины с чётной раскраской считаем "Чётными", а вершины с нечётной раскраской - "НеЧётными"
Таким образом, у нас есть один "квадратик" 'W' и "кружок" 'L'. Вершины 'W' и 'L' - это стоки.
При построении раскраски будет использовать следующий принцип:
 Вершина будет Нечётной - если существует ход в Чётную
 Вершина будет Чётная - если все ходы ведут в Нечётную
Выполнение этого алгоритма позволяет построить двудольный ориентированный граф игры
 

Пример двудольного графа игры

 

Рассмотрим игру по следующим правилам.
Два игрока, Петя и Ваня, играют в следующую игру.
Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя.
За один ход игрок может добавить в большую из  куч пять камней или увеличить количество камней в меньшей куче в два раза.
Если количество камней в кучах одниковое, то в любую из куч можно добавить три камня.
Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается в тот момент, когда произведение камней в кучах становится не менее N.
Победителем считается игрок, сделавший последний ход, т.е. первым получивший такую позицию,
при которой произведение камней в кучах будет N или более.
В начальный момент в первой куче было x камней, во второй куче – y камней (1 ≤ x*y <N).
Полное условие и вопросы в задании 49932
Ниже приведен основной блок программы с комментариями для решения заданий такого типа.
Решение не зависит от конкретных правил игры. Настройка на правила осуществляется программами start и next.
Возможна оптимизация (по времени за счет памяти), при которой вызов программы next может быть заменен на создание словаря смежных вершин


   




ПОВЫШАЕМ ЭФФЕКТИВНОСТЬ
Подпрограмм solve решает задание на полную глубину, то есть пока не останется вершин без раскраски.
Для решения заданий ЕГЭ и некоторых других можно ограничить глубину просмотра. 
Для этого достаточно всего изменить пару операторов
def solve(N,tmax=None): # Построение словаря раскраски
# tmax - максимальное кол-во тактов

....
while Q and (tmax==None or t<tmax) : # ПОКА не ВСЕ вершнины имеют раскраску
# добавлень ограничение намаксимальное количество выполняемых тактов

Теперь при вызове solve(N,6) программа будет считать только на нужное число ходов
Запустите "ПРОГРАММА №2" для N=1000 - будет превышение времени
Запустите "ПРОГРАММА №3" для N=1580 с помощью 
solve(N,4)  - ответ будет получен
Следующий способ оптимизации - это "сокращение" множества стартовых вершин (если это возможно) и 
использование вместо подпрограммы next "словаря смежности"


 


ИТОГИ.
  1. Подготовлена программа для решения "трудоемких" задач
  2. Возможно дальнейшее усовершенствование
Ниже приведен базовый текст программы для решения задания 44373


РЕШАЕМ "гробик" с kompege.ru
 
Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать