Чтобы решить игру NIM, мы рассчитываем Nimbers:
- состояние проигрыша имеет номер 0
- Остальная часть nimbers рассчитывается путем просмотра всех достижимых состояний и взятия mex (минимального эксклюзива), который является наименьшим отсутствующим числом в последовательности 0, 1, 2, 3, ...
- nimber (21) = 0
- nimber (20) = 1, только 0 может быть достигнуто, поэтому 1 - это мекс
- nimber (19) = 2, 0 и 1 могут быть достигнуты за один ход, поэтому мекс равен 2
- nimber (18) = 3
- nimber (17) = 0, потому что мы можем достичь 1 к 3, поэтому 0 - наименьшее пропущенное число
и так далее ...
Легко видеть, что это повторяется. Таким образом, мы можем вычислить число как это (n
- текущее состояние): 3 - (n + 2) % 4
. Или обобщенно, если мы можем считать до x
чисел и проигрышное число равно y
: мы хотим добавить z
к y
, так что (y + z) % (x + 1) = x
, а затем формула будет x - (n + z) % (x + 1)
. Можно также сказать, что y % (x + 1) + z = x
(чтобы найти наименьшее неотрицательное z
, другая формула имеет бесконечное количество решений для z
), поэтому z = x - y % (x + 1)
.
Таким образом, если nimber состояния не равен 0, выигрышный ход - это переход в следующее проигрышное состояние с nimber 0. Как оказалось, выигрышный ход (сколько чисел считать) в точности равен nimber .
Важно отметить, что 21 обозначает состояние, когда было сказано 20, а 21 еще не было сказано.
Это становится интересным, когда мы играем с несколькими экземплярами, как, например, карты с нумерацией от 1 до 21 в нескольких стопках, где вы можете взять от 1 до 3 самых младших карт в стопке. Тот, кто берет самую последнюю карту, проигрывает. Здесь мы можем просто переписать число всех стеков, если оно равно 0, мы находимся в проигрышном состоянии, в противном случае выигрышный ход.