Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Алгоритмы _ Стратегия игры "Три числа"

Автор: Vinchkovsky 9.06.2007 21:04

Есть игра "Три числа" - на листке бумаги написано 3 числа, не отрицательных, большых от нуля или равных ему.
Тот, у кого есть ход, вычеркивает ОДНО из этих чисел и на его место ставит меньшее, но НЕ МЕНЬШЕ НУЛЯ. НУЛЬ НЕЛЬЗЯ ВЫЧЕРКИВАТЬ. Игра заканчивается, когда не возможно ничего сделать, выигрывает тот, который сделал последний ход. Как, зная все 3 числа и того, кто ходит первым, определить, кто выиграет (то есть какая стратегия и тактика этой игры)?
ПОДСКАЗКИ:
1) при числах 3, 4, 5 выигрывает тот, кто ходит первый;
2) при числах 7,0,7 выигрывает второй, он должен повторять ходы противника wink.gif

Просьба помочь мне, а именно - подсказать тактику/стратегию этой игры wink.gif

Автор: Michael_Rybak 10.06.2007 4:49

http://ru.wikipedia.org/wiki/%D0%9D%D0%B8%D0%BC_%28%D0%B8%D0%B3%D1%80%D0%B0%29

И дальше - гуглом ищешь более подробное объяснение, если нужно.

Автор: Vinchkovsky 10.06.2007 15:26

Большущее спасибо...
Возник вопрос - а как к этому можно додуматься самостоятельно, если ничего об этом ранее не знал?
А ведь задача-то с школьной олимпиады - задание следующее: определить по трем числам победителя и вывести общий счет первого и второго игрока unsure.gif

Автор: Michael_Rybak 11.06.2007 6:36

Ну, как-то можно smile.gif Меня тоже такой вопрос интересует иногда, только для других задач smile.gif И кстати в свое время и для этой тоже - сам не придумал. Действительно, очень уж специфично, на первый взгляд.

А на самом деле, этот алгоритм лежит в основе значительно более крупного объекта в теории игр - чисел Спрага-Грюнди. Хочешь - погугли-почитай.

От школьников никаким образом не может требоваться придумывать такие вещи на школьных олимпиадах; просто именно эта игра - считай, классика теории игр, и такие вещи считаются общеизвестными (да и, начиная с некоторого уровня, такими и являются).

Так что ты столкнулся скорее с проблемой нехватки знаний чем с проблемой нехватки смекалки, не расстраивайся smile.gif

P.S. Хочешь, подумай над обратной игрой: тот, кто делает последний ход - проигрывает. Вот тут уже можно придумать самому, хотя тоже непросто.

Автор: Bokul 11.06.2007 8:29

Цитата
А на самом деле, этот алгоритм лежит в основе значительно более крупного объекта в теории игр - чисел Спрага-Грюнди. Хочешь - погугли-почитай.

Не поверишь - вообще не http://www.google.ca/search?q=%D0%A1%D0%BF%D1%80%D0%B0%D0%B3%D0%B0-%D0%93%D1%80%D1%8E%D0%BD%D0%B4%D0%B8&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:fr:official&client=firefox-a, даже не http://search.yahoo.com/search;_ylt=A0geu.7epWxG4ZUA9xtXNyoA?p=%D0%A1%D0%BF%D1%80%D0%B0%D0%B3%D0%B0-%D0%93%D1%80%D1%8E%D0%BD%D0%B4%D0%B8&y=Search&fr=yfp-t-501&fp_ip=CA&rd=r1&meta=vc%3Dca, а о http://www.rambler.ru/srch?words=%D1%EF%F0%E0%E3%E0-%C3%F0%FE%ED%E4%E8&old_q=yahoo&btnG=%CD%E0%E9%F2%E8%21 даже вспоминать не буду blink.gif Ноль, полный ноль nea.gif
Цитата
считаются общеизвестными (да и, начиная с некоторого уровня, такими и являются).

Это ж какой уровень надо, если всемирная паутина о таком не слышала... rolleyes.gif

Автор: Vinchkovsky 11.06.2007 13:56

Bokul , ищи обширнее yes2.gif
Кое-что находит об "Спаре-Грюнди" и "Шпраге-Грюнди" wink.gif
Например: http://mashinnyi-razum.narod.ru/mirovoegospodstvo/mashinny_razum_-_mirovoe_gospodstvo1.html
Ну и статья, которая ставит "все точки над i": http://en.wikipedia.org/wiki/Sprague–Grundy_theorem (в Википедии ТОЛЬКО на английском) yes2.gif
Ну и на иглише можно что-то найти...
В тему: http://en.wikipedia.org/wiki/Category:Combinatorial_game_theory
http://en.wikipedia.org/wiki/Dynamic_programming (на разных языках, но на английском - самая полная версия статья) wink.gif

Цитата
От школьников никаким образом не может требоваться придумывать такие вещи на школьных олимпиадах; просто именно эта игра - считай, классика теории игр, и такие вещи считаются общеизвестными (да и, начиная с некоторого уровня, такими и являются).
Так что ты столкнулся скорее с проблемой нехватки знаний чем с проблемой нехватки смекалки, не расстраивайся

Наверное, так и есть (никогда бы не додумался слаживать размеры кучок в двоичной системе, шел в совершенно другом направлении - смотрел парность кучек, их размеров и т.д. и т.п.).
Спасибо за советы wink.gif

Автор: Michael_Rybak 12.06.2007 0:04

Кстати, кстати. Теория - теорией, но такой вопрос: какие были ограничения на числа? Чисел ровно три, и если каждое, скажем, не больше 100, то она решается очень легко без всякой теории smile.gif (как?)

Относительно недавно на одной польской олимпиаде была задача на очень сложную теорию игр, и после тура организаторы (в высшей степени компетентные люди) рекомендовали вот эту ссылку: http://www.math.ucla.edu/~tom/Game_Theory/Contents.html

Сам не смотрел, но смело рекомендую smile.gif

Автор: Vinchkovsky 12.06.2007 0:19

Все три числа >=0 и <=1000 rolleyes.gif
Это что-то меняет?
Документ скачал, буду разбиратся (английским владею не свободно), спасибо wink.gif

Автор: Michael_Rybak 12.06.2007 1:57

Меняет принципиально.

Тогда все решалось проще (конечно, кодить проще классический алгоритм, но придумать его сложнее).

Просто генерим все проигрышные тройки, т.е. такие тройки, в которых игрок, делающий первый ход, проигрывает.

1) Тройка (0, 0, 0) - проигрышная (нельзя сделать ход).
2) Тройка (a, b, c) - проигрышная тогда и только тогда, когда из нее нельзя сделать ход в проигрышную тройку.

Делаешь три вложеных цикла, и проверяешь. Тут, правда, есть свои сложности - с хранением найденных троек, особенно если давали только турбо паскаль (память >64K можно выделить только динамически).

Довольно удобна такая уловка: из второго правила сразу видим, что для данных a и b может быть только одно с такое, что тройка (a, b, c) - проигрышная. Поэтому можно завести двумерный массив 1000х1000, и его значение в точке (a, b) - это соответствующая с, или -1, если с еще не нашли. В таком вот духе smile.gif

Разобраться стоит и с этим решением, возможно, от вас ждали именно чего-то такого.