машуня89
23.11.2022 12:11

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

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

Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации,
которая ему может встретиться при различной игре противника.

Выполните следующие задания. Во всех случаях обосновывайте свой ответ.

1. а) Укажите все такие значения числа S, при которых Петя может выиграть в один ход.
Обоснуйте, что найдены все нужные значения S, и укажите выигрывающий ход для каждого указанного значения S.

б) Укажите такое значение S, при котором Петя не может выиграть за один ход, но при любом ходе
Пети Ваня может выиграть своим первым ходом. Опишите выигрышную стратегию Вани.

2. Укажите два таких значения S, при которых у Пети есть выигрышная стратегия,
причём (а) Петя не может выиграть за один ход и (б) Петя может выиграть своим вторым ходом независимо от того,
как будет ходить Ваня. Для каждого указанного значения S опишите выигрышную стратегию Пети.

3. Укажите значение S, при котором:

— у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети,
и

— у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Для указанного значения S опишите выигрышную стратегию Вани. Постройте дерево всех партий, возможных при этой
выигрышной стратегии Вани (в виде рисунка или таблицы). На рёбрах дерева указывайте,
кто делает ход, в узлах — количество камней в куче.

Нажмите на рекламу ниже и сразу увидите ответ
Популярные вопросы:
Ответ:
princessTonya
12.11.2022 14:30
Для проверки, закрыты ли все скобки, можно было бы просто их посчитать, но мы будем проверять правильность вложенности. Для этого нам пригодится std::stack (да, и решаем на С++).

#include <iostream>
#include <stack>
#include <string>
using namespace std;
typedef unsigned short int USI;

bool hasCorrectBracing(string);

int main()
{
setlocale(0, ""); // кириллица
USI N;
cout << "N = ";
cin >> N;
string row;

for(size_t i = 1; i <= N; i++)
{
cout << "Строка " << i << ": ";
cin >> row;
if ( hasCorrectBracing(row) )
{
cout << "Good\n";
}
else
{
cout < "Bad\n";
}
}

return 0;
}

bool hasCorrectBracing(string r)
{
stack <char> st;

for(string::size_type c = 0;
c < r.size();
c++)
{

if (r[c] == '(')
{
st.push('(');
continue;
}
else
{
if (r[c] == '[')
{
st.push('[');
continue;
}
else
{
if (r[c] == '{')
{
st.push('{');
continue;
}
}
} // end 1st if

if
(
(
(st.top() == '(')
&&
(r[c] == ')')
)
||
(
(st.top() == '[')
&&
(r[c] == ']')
)
||
(
(st.top() == '{')
&&
(r[c] == '}')
)
)
{
st.pop();
} //end 2nd if

} // end for

if ( st.empty() )
{
return true;
}
else
{
return false;
}

} // end fun
0,0(0 оценок)
Ответ:
MrKom1
12.11.2022 14:30
Посмотрел решение на С++. Ну что же, я недаром зову его "полуассемблер" - нечего ему в общеобразовательных школах делать... Писать долго, много и непонятно для непосвященных. А сколько при этом можно ошибок сделать - просто жуть.
Вот для сравнения решение на Паскале. Я тоже использовал стек, чтобы проще было сравнивать)))

// PascalABC.NET 3.2, сборка 1370 от 24.12.2016
// Внимание! Если программа не работает, обновите версию!

function IsGood(s:string):Boolean;
begin
  var St:=new Stack<char>;
  foreach var c in s do
    case c of
    '(':St.Push(c);
    ')':if St.Count>0 then St.Pop
        else begin Result:=false; Exit end;
    end;
  Result:=St.Count=0
end;

begin
  var n:=ReadlnInteger('N=');
  var s:=ReadArrString(n);
  s.Select(x->IsGood(x)).Select(x->x?'Good':'Bad').Println(NewLine)
end.

Контрольный пример (скобки "разбавлены" числами, чтобы было ясно, что программа не только скобки умеет читать, но и проверять их расстановку в произвольной строке)

N= 4
12(3)456(7)8
123((67)8)
12)34(5
(1(234)567
Good
Good
Bad
Bad
0,0(0 оценок)
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota Оформи подписку
logo
Начни делиться знаниями
Вход Регистрация
Что ты хочешь узнать?
Спроси ai-бота