﻿ГОЛЯМ ПРОЕКТ ПО ИЗБИРАЕМАТА УЧЕБНА ДИСЦИПЛИНА

"АЛГОРИТМИ ЗА КОМБИНАТОРНИ И ОПТИМИЗАЦИОННИ ПРОЦЕСИ"

(СУ, ФМИ, ЛЕТЕН СЕМЕСТЪР НА 2018 / 2019 УЧ.Г.)



Студент: Емилиян Иванов Рогачев.

Факултетен номер: 31445.

Тема на проекта: Приложение на сюрреалните числа в комбинаторната игра "Жаби".



Описание на проекта: Известно е, че всяка комбинаторна игра G за двама души L и R

попада в точно един от следните класове:

G  > 0 <=> печели L,  независимо кой играе първи;

G  < 0 <=> печели R,  независимо кой играе първи;

G  = 0 <=> печели този играч, който е втори на ход;

G || 0 <=> печели този играч, който е първи на ход.

(Символът || означава, че игри в лявата и дясната страна са несравними.

Четвъртата възможност различава сюрреалните игри от сюрреалните числа:

числата са сравними винаги.)


В настоящия проект анализираме комбинаторната игра "Жаби" (англ. "Toads and frogs")

с помощта на сюрреални игри. Играта "Жаби" има следните правила:

Игралното поле е редица от n клетки, всяка от които е или празна, или заета от жаба. 

Жабите са два вида — T (toads) и F (frogs): по един вид за всеки от играчите L и R

(L играе с жабите от тип T, а пък R играе с жабите от тип F).

На всеки свой ход играчът L избира жаба от тип T и я премества с една клетка надясно,

ако такава клетка има и тя е свободна (незаета). Ако клетката е заета от жаба от тип F,

жабата T може да я прескочи, но само ако има следваща клетка и тя е свободна.

Аналогични правила важат за играча R, само че той мести жабите от тип F наляво.

Всяка жаба може да прескача само жаби от другия вид, и то най-много една на всеки скок.

Губи играчът, който няма ход.


Програмата "Toads and frogs", написана на Си, анализира всички позиции с дадена дължина n

и ги категоризира по един от четирите възможни начина: 

печеливши за L или за R, независимо кой от тях е първи на ход;

печеливши за този, който е на ход първи, или за този, който е на ход втори.

Дължината n на игралното табло е зададена като константа в програмата.

Програмата отпечатва таблицата с резултатите на стандартния изход.

Изходът е със следния формат:

Всеки ред съответства на една позиция и се състои от:

— описание на позицията; 

— интервал;

— някой от знаците L, R, 0 и |.

Описанието на позицията е низ от знаци T, F и къси тирета  ( - ).

Тиретата съответстват на празните клетки.


Алгоритъмът, използван за категоризиране на позициите, е динамично програмиране.

Алгоритъмът е рекурсивен и използва запомняща функция, 

което спестява повторното изчисляване на вече пресметната стойност.
