На этом форуме отвечают на конкретные вопросы. Фраза «я не понимаю, как решать» — это не вопрос. На вопрос «как решить задачу №X» вас отошлют к материалам сайта kpolyakov.spb.ru. За бессвязный поток слов и неспособность формулировать свои мысли — бан.

Если у вас не сходится ответ на какую-то задачу, пожалуйста сразу представляйте свое «правильное» решение.
Программы "заворачивайте" в тэг [pre2]...[/pre2], при этом сохраняются все отступы и применяется моноширинный шрифт. Если у вас используется сочетание "[i]" для обозначения элемента массива или строки, ставьте пробел после открывающей скобки. Иначе система выделит все дальнейшее курсивом.

Для регистрации на форуме щелкните по ссылке «Вход-регистрация» вверху страницы. В открывшееся окошко «ник» введите свою фамилию на русском языке (например, Иванов). В окошко «пароль» введите придуманный вами пароль, состоящий из латинских букв и цифр. Поставьте галочку в окошке «зарегистрироваться, я новый участник» и нажмите кнопку «ОК».

АвторСообщение



Сообщение: 12
ссылка на сообщение  Отправлено: 23.06.22 08:01. Заголовок: Универсальное программное решение задач 19-21 для всех типов условий


наконец довел до ума программное решение (PascalABC.Net) задач теории игр (19-21).
оно было готово накануне первого дня егэ и я даже создал здесь тему, но сразу же тему удалил потому что программа не была достаточно хорошо проверена и я опасался что елси она в каких истуациях будет работать некоректно то я подведу людей которые ею воспользуются. на данный момент работа проверена на 10-12 задачах, результаты корректны. до резервного дня времени много, тем кто будет сдавать в резерв есть время проверить работу.
данная программа позволяет применять ее в задачах когда имеется верхняя граница выигрышного количества камней в кучах, задачи с суперходом (когда один раз за игру кем либо из игроков совершается ход при котором количество камней в куче остается неизменным - простыми словами пропуск хода), задачи в которых есть условие о том что игрок не может совершить такой же ход который до него совершил противник. Программа очень простая, портировать на Питон не составит труда.
Необходимо проверить работоспособность программы на реальных задачах елси выдаст правильные ответы то использовать на ЕГЭ.
В примере приведена абстрактная, задача с двумя кучами и двумя возможными операциями , с ограничением на максимальное значение камней в куче, с суперходом и с запретом повторять ход противника (все гадкие условия в одной задаче).
Если кем-то где-то выкладывалось подобное универсальное решение, то прошу не счесть за плагиат.
Решение построено на основе базового решения найденного в сети интернет и доработано до максимально универсального состояния - тратить время на поиск этого решение в сети интернет не хочу.
Еще раз повторю - программу нужно проверить на реальных задачах!!! на десятке задач программа отрабатывает корректно.
var n:=74; // превышение выигрышного числа камней. если такое условие отсутствует, то указываем любое очень большое n, например 10000
var win:=[63..n];//множество допустимых значение количества камней в куче когда игрок побеждает
function f(s1,s2,st,mst,lo,sps:integer):boolean;// s1 - 1 куча, s2 - 2 куча, st - текущий ход, mst - максимальное число ходов, lo - последний ход, sps - суперход (0 - еще не был совершен, не 0 - суперход совершен)
begin
if (s1+s2) in win then f:=(mst-st).IsEven // проверка на четность хода требуемого игрока, на котором достигнуто выигрышное число камней в куче наши ходы
else
if (s1+s2)>n then f:=(mst-st).Isodd // иначе проверка на нечетность хода противника, на котором превышено число камней в куче - елси противник превысил то требуемый игрок выигрывает
else
if st=mst then f:=false // иначе при достижении максимального числа ходов - такая последовательность ходов не привела к концу игры и является проигрышной
else
if (mst-(st+1)).IsEven //иначе если четность очередного ход будет соответсвовать четности требуемого игрока
then
begin
var t:=false; //для комбинации OR (соответсвует ANY) начинаем со значения false
if sps=0 then t:=t or f(s1,s2,st+1,mst,0,sps+1); // елси суперход не совершен, то его добавляем в комбинацию возможных ходов и увеличиваем 6-й параметр на 1 тем самым блокируя дальнейшее использование суперхода, если в условии задачи суперход не предусмотрен, то закомментируем эту строку
if lo<>1 then t:=t or f(s1+1,s2,st+1,mst,1,sps); // проверяем код последнего хода и включаем/не включаем в комбинацию возможных ходов
if lo<>2 then t:=t or f(s1,s2+1,st+1,mst,2,sps); // и передаем код текщего хода в качестве 5 параметра lo
if lo<>3 then t:=t or f(s1*2,s2,st+1,mst,3,sps); // если условие задачи не предусматривает запрет поторять ход противника, то в качестве 5-го параметра передаем везде 0 или неизмененное начальное значение lo вместо 1,2,3,4)
if lo<>4 then t:=t or f(s1,s2*2,st+1,mst,4,sps); // для обычных ходов значение суперхода не меняется
f:=t;//возвращаем результат кобинации ходов как результат функции
end
else
begin
var t:=true;//для комбинации OR (соответсвует ANY) начинаем со значения false, либо для комбинации AND (соответсвует ALL) начинаем со значения true,
if sps=0 then t:=t and f(s1,s2,st+1,mst,0,sps+1);//обработка суперхода и последних ходов такая же как описано выше.
if lo<>1 then t:=t and f(s1+1,s2,st+1,mst,1,sps);//если протвиник играет оптимально без ошибок
if lo<>2 then t:=t and f(s1,s2+1,st+1,mst,2,sps);//для ходов противника используем кобинацию AND (соответствует ALL)
if lo<>3 then t:=t and f(s1*2,s2,st+1,mst,3,sps);//либо используем комбинацию OR (соответсвует ANY)
if lo<>4 then t:=t and f(s1,s2*2,st+1,mst,4,sps);//елси по условию задачи противник совершил ошибку
f:=t;//возвращаем результат кобинации ходов как результат функции
end;
end;
begin
for var s:=1 to 53 do
for var mst:=0 to 4 do //значение 4 соответствует 2-му ходу Вани, 3 соответствует 2-му ходу Пети, 2 соответствует 1 ходу Вани, если в условии требуется найти имеет ли Ваня или Петя вообще выи грышную стратегию то нужно в уме прикинуть и указать необходимое и достаточное верхнее значение mst в цикле (например 10, обычно к этому ходу уже все решения вырождаются в одинаковые)
if f(9,s,0,mst,0,0)//при начальном вызове номер последнего хода lo считается равным нулю, суперход sps тоже равен нулю,если в задаче не пердусмотрен суперход то можно передатьв начале sps=-1
then println(s,mst)
end.

PS. приношу извинения за ошибки, опечатки и знаки препинания. как говорится в известной шутке : "вам шашечки? или ехать?"

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 1 [только новые]





Сообщение: 13
ссылка на сообщение  Отправлено: 24.06.22 12:54. Заголовок: //чистый код без ком..


//чистый код без комментариев к коду
var n:=74;
var win:=[63..n];
function f(s1,s2,st,mst,lo,sps:integer):boolean;
begin
if (s1+s2) in win then f:=(mst-st).IsEven
else
if (s1+s2)>n then f:=(mst-st).Isodd
else
if st=mst then f:=false
else
if (mst-(st+1)).IsEven
then
begin
var t:=false;
if sps=0 then t:=t or f(s1,s2,st+1,mst,0,sps+1);
if lo<>1 then t:=t or f(s1+1,s2,st+1,mst,1,sps);
if lo<>2 then t:=t or f(s1,s2+1,st+1,mst,2,sps);
if lo<>3 then t:=t or f(s1*2,s2,st+1,mst,3,sps);
if lo<>4 then t:=t or f(s1,s2*2,st+1,mst,4,sps);
f:=t;
end
else
begin
var t:=true;
if sps=0 then t:=t and f(s1,s2,st+1,mst,0,sps+1);
if lo<>1 then t:=t and f(s1+1,s2,st+1,mst,1,sps);
if lo<>2 then t:=t and f(s1,s2+1,st+1,mst,2,sps);
if lo<>3 then t:=t and f(s1*2,s2,st+1,mst,3,sps);
if lo<>4 then t:=t and f(s1,s2*2,st+1,mst,4,sps);
f:=t;
end;
end;

begin
for var s:=1 to 53 do
for var mst:=0 to 4 do
if f(9,s,0,mst,0,0) then println(s,mst)
end.

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 190
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет