Программирование игр и головоломок
Шрифт:
q = целая_часть ((
Имеем
h(n) = n + целая_часть ((
Покажите это по индукции. Исходя отсюда, вычисляется все. Таким образом, если n дано, то р — наименьшее целое, большее или равное
(2n– 1 -
Игра 35.
Возьмем,
Чтобы переместить 40 дисков с 4 стержнями, сводим задачу к перемещению 31 диска с 4 стержнями, а затем 9 с 3 стержнями…
Таким образом, дело сводится к разбиению 50 дисков на 8 сегментов:
Каждый сегмент перемещается с использованием 3 стержней, в чем мы следуем итеративной стратегии, которая уже описана выше. Единственный вопрос — это правильный выбор запасных стержней.
Договоримся работать с тремя стержнями 0, 1, 2, так что стержень 3 остается пустым и служит запасным стержнем при любом перемещении какого-либо сегмента. Более точно, перемещение сегмента р со стержня d на стержень а осуществляется с помощью изученной выше процедуры Н, в которой запасным стержнем является стержень 3.
Сегмент 1 перемещается в каждый из двух ходов подряд (под ходом я понимаю последовательность операций, реализующих процедуру Н), всегда в одном и том же направлении.
Мы сохраняем предыдущую итеративную стратегию, но понимаем ее как стратегию для сегментов. На компьютере это может пройти очень быстро. Вполне вероятно, что робот может осуществить одно перемещение за несколько секунд. Тогда на всю игру потребуется не более чем несколько часов…
Игра 36.
Соотношение SG (p, q) = 0 означает, что вы не можете достичь ситуации с числом Спрага-Грюнди, равным нулю, удаляя не более 2q спичек из кучки с р спичками. Если вы исходите из SG (р, q' < q), то вы не можете удалить столько же спичек и, следовательно, нет опасности, что вы получите число SG, равное нулю.
Предположим, что SG (pi, 1) = 0.
Исходя из pi + 1, я могу удалить 1 спичку и получить пару pi, 1. Следовательно, SG (pi + 1, q) /= 0.
Исходя из pi + 2, я для любого q всегда могу удалить две спички, но тогда я получаю SG (pi, 2) /= 0, и, следовательно,
SG (pi + 2, 1) = 0.
Если
в pi имеем qi > 1, то тогда мы этого не получим и SG (pi + 2, 1) /= 0. Но в pi + 3, удаляя единственную спичку, получаем пару pi + 2, 1 c SG /= 0, или же, удаляя две спички, получаем пару pi + 1, 2 с ненулевым числом SG. Следовательно, SG (pi + 3, 1) = 0.Все оставшееся уже очень хорошо подготовлено. Рассмотрите точку р, для которой диагональ пересекает ось р = 0, не пересекая положений с нулевым SG. Эта прямая задается уравнением x + у = р. Она пересекает ось x = 0 в точке у = р. Нельзя взять в точности р спичек, — можно не больше р– 1. Следовательно, в этой точке
q = целая_часть ((р– 1)/2).
Рассмотрим теперь точку, абсцисса которой есть число Фибоначчи: р = fib (s).
Нужно показать, что прямая x + у = fib (s) не пересекает точек с ненулевыми SG, кроме x = 0. Рассмотрим сначала точку
х = fib (s– 1).
В этой точке
у = fib (s) - fib (s– 1) = fib (s– 2).
При p = fib (s– 1)
q = целая_часть ((fib (s– 1) - 1)/2).
Нужно показать, что для каждого s
целая_часть ((fib (s– 1) - 1)/2) < fib (s– 2),
или, что равносильно,
fib (s– 1) < 2 * fib (s– 2) + 1.
Но
fib (s– 1) = fib (s– 2) + fib (s– 3)
и
fib (s– 3) < fib (s– 2).
Следовательно, рассматриваемая диагональ не пересекает точек с нулевым SG в fib (s– 1). Она не может пересекать их и между s– 1 и s, поскольку эта часть воспроизводит то, что происходит в интервале от 1 до fib (s– 2), а диагональ, выходящая из fib (s– 2), не пересекает точек с нулевым SG до оси q.
- Telegram
- Viber
- Skype
- ВКонтакте