Функция Гранди
Позиции мало приписать «выигрышная или проигрышная»: чтобы складывать игры, нужно число. Это число — mex по достижимым позициям.
3 мин
Булева пометка «выигрышная или проигрышная» отвечает на вопрос про одну игру. Но если играют сразу в несколько независимых игр и ход — сходить в любой из них, знания исходов по отдельности не хватает: две проигрышные игры вместе могут оказаться выигрышными, а могут и нет.
Чтобы игры можно было складывать, позиции приписывают число — значение Гранди:
где множества — наименьшее неотрицательное число, которого в нём нет. У позиции без ходов множество пусто, и .
Связь с исходом
Позиция проигрышная тогда и только тогда, когда .
Обе стороны следуют прямо из :
- если , то нуля среди значений соседей нет — все ходы ведут в выигрышные позиции;
- если , то все числа среди соседей есть, в частности ноль, — есть ход в проигрышную.
То есть для одной игры Гранди не даёт ничего нового. Всё богатство — в сумме игр.
Как считать
int grundy(int v) {
if (computed[v]) return value[v];
computed[v] = true;
std::vector<char> seen(moves[v].size() + 1, 0);
for (int u : moves[v]) { int g = grundy(u); if (g < (int)seen.size()) seen[g] = 1; }
int m = 0;
while (m < (int)seen.size() && seen[m]) m++;
return value[v] = m;
}
Размер seen выбран не случайно. Значение по числам не превосходит , поэтому массива длины хватает всегда, а всё, что больше, можно не запоминать. Суммарно по всем вершинам это — без этого приёма получилось бы памяти или лишний логарифм на множество.
Кратные рёбра значение не меняют. считается по множеству, а повтор в множестве ничего не добавляет. Но время они съедают, так что при рёбрах цикл всё равно проходит все штук.
Чему равно значение Гранди
Заранее — ничему. Для конкретной игры его считают перебором на маленьких размерах, после чего смотрят на таблицу и угадывают закономерность; см. «Как искать закономерность».
Пара примеров, чтобы было с чем сравнивать:
| игра | значение Гранди |
|---|---|
| куча , берут сколько угодно | |
| куча , берут от 1 до | |
| куча , берут элемент из | периодично, период ищется перебором |