1. Создаем программу "раскраски"


В этой статье будут обозначены основные идеи создания программы для описания "выигрышной стратегии" (ВС) при решении заданий ЕГЭ (19-21) с "одной кучей".  
Описать ВС, значит создать "двудольный граф игры", в котором вершинами являются все возможные состояния игры, а ребра указывают на возможные ходы игроков. Вершины будут "раскрашены" в "квадратики" (чётные цвета) и "кружки" (нечётные цвета). Ориентированные ребра графа будут обозначать ходы и могут соединять  "квадратик" с "кружком" или "кружок" с "квадратиком".
Игрок "1-го хода" будет иметь ВС, если "игра" начинается с "кружка", иначе ВС есть у игрока "2-го хода". 


 

Как создать такую раскраску с помощью программы?
Один из способов "продубрировать действия"  следующего алгоритма

# Начальная «раскраска» списка вершин Q
Q =  start(…) # содержимое из условия задачи
t, go = 0, True #номер шага, флаг
while go :
    t+=1 # делаем такт нечетным (это кружки)
    A=first(Q, t) #ищем «кружки», A – новые кружки
    
t+=1
# делаем такт чётным (это квадратики)
    B=second(Q, t) # определяем «квадратики», B – новые квадратики

     go=A or B # надо ли продолжать
    print(t//2,A,B) # результаты хода, если это удобно

Напишите основной блок программы (остальные подпрограммы уже созданы) и сравните свой ответ с эталоном




В задании ЕГЭ, как правило, "глубина" вопросы не более чем на три хода (6 тактов). 
Измените текст программы так, чтобы вывод состоял только из первых трех строчек (переменную go удалите)
Найдите ответы на вопросы задания из ЕГЭ и проверьте их  с помощью задания
Задание 38999 (ЕГЭ 19-21)

 

СОЗДАЕМ ПОДПРОГРАММУ start()
Подпрограмма start() определяется условиями задачи и тем, как планируется организация вершин.
Рассмотрим наш пример (команды +1, *2, старт 1-32, завершение - не менее 33): 
1. Можно считать, что Q - список размера 65 (стартовые вершины 1-32, финальные вершины 33-64 и 0 - "для удобства обращения);
2. Можно считать, что Q - список  размера 33 ( стартовые вершины 1-32 и финальная вершина - используем 0)
3. Возможно использования трех множеств - Q (стартовые вершины), W (выигрышные/квадратики) и L (проигрышные/кружки)
Пока остановимся на 1 варианте, как на наиболее простом
Программа start() для примера могла выглядеть так:
def start():
     return [None]*33+[0]*32
Напишите основной фрагмент программы и подпрограмму start(n) для варианта игры с параметром N 

Два игрока, Петя и Ваня, играют в следующую игру.
Перед игроками лежит куча камней.
Игроки ходят по очереди, первый ход делает Петя.
З
а один ход игрок может добавить в кучу
один или два камня или увеличить количество камней в куче в два раза.
Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.

Игра завершается в тот момент, когда количество камней в куче становится не менее N.
Победителем считается игрок, сделавший последний ход, т.е. первым получивший кучу, в которой будет N или больше камней.

В начальный момент в куче было S камней, 1 ≤ S < N.
Входные данные:

Одно число N (1<N<100)

Правильность работы проверьте с помощью задания Задание 39900 (ЕГЭ 19-21)

   


СОЗДАЕМ ПОДПРОГРАММУ first(Q,t)
Подпрограмма first(Q,t)  должна найти все найти все новые "зелёно-кругло-чётные" вершины (поля из должен ходить игрок с ВС)
Сделать это можно "путём обхода всех нераскрашенных вершин Q и проверки из смежных вершин"
Вот возможное решение ("шелкните для просмотра):

Напишите фрагмент программы first (Q,t) (остальные блоки заполнениы), запустите программу (в условиях последнего примера) 
и убедитесь, что она возвращает аналогчный результат. (При N=70 программа должна напечатать список со значениями от 35 до 69 включительно)
Программа next(p) имеет следующий формат:
def next(p):
    return [p+1,p+2,p*2]

 


СОЗДАЁМ ПОДПРОГРАММУ second(Q,t)
Подпрограмма second(Q,t) определяет вершины, которые должны быть раскрашены в "красно-квадратно-чётный" цвет (это поля в которые должен ходить игрок с ВС)
Эта попрограмма аналогична подпрограмме first(Q,t) и легко создается из неё методом "copy-paste"
Вот текст этой подпрограммы (красным цветом выделены отличия от подпрограммы first)

Напишите фрагменты программ first(Q,t) и  second(Q,t). Проверьте правильность работы  программы на следующем примере
(для N=70 во второй строке должно быть список с одним значение 34 )
 


СОЗДАНИЕ ПОДПРОГРАММЫ next(p)
Подпрограмма next(p) должна возвращать вершины, смежные с p (то есть вершины, в которые есть ход) 
Содержимое подпрограммы определяется условием, и способом хранения вершин. 
В самом простом виде (в Q есть все возможные состояния и нарушения границ списка быть не может) 
она может иметь вид :
def next(p):  # для команд +1, +2, *2
    return [p+1,p+2, p*2]


def next(p):  # для команд -1, -3, //2 (деление только четных)
    if p%2  == 0 :
        
return [p-1,p-3, p//2]
    return [p-1,p-3]


Теперь можно написать полный текст программы и попробовать решить различные задания модуля
Для удобства прилагается возможное решение. Это решение можно назвать "наивным", поскольку оно моделирует "ручной" процесс решения задания.
Такого способа достаточно для решения всех "реальных" заданий ЕГЭ
В другой статье будет рассмотрен более эффективные методы решений.



Напишите свою программу и попробуйте решить задания модуля.
Попробуйте распечатать список Q и понять, что за числа там записаны 

 


ПОДВЕДЕМ ИТОГИ
 

time 1000 ms
memory 256 Mb

Комментарий учителя