Программирование игр и головоломок
Шрифт:
Простое итеративное решение имеет следующий вид: исходя ив четности n определите направление перемещения диска 1. Начните с 2n– 1 число ходов, которые осталось сделать:
Все диски имеют общее свойство: нечетные диски перемещаются в том же направлении, что и диск 1, а четные диски — в другом направлении.
В вышеприведенной программе стратегия совершенна с точки зрения исполнения вручную, потому что в каждый данный момент сразу видно, какой диск нужно переместить, если это не самый маленький диск (меньший из двух остальных дисков перемещается на больший). В нашей программе вам нужно вычислить это движение. Один из наиболее простых способов состоит в том, чтобы представить игру с помощью вектора, дающего для диска i номер стержня, на котором он находится. Диск, подлежащий перемещению — это наименьший Диск, который находится не на том же стержне, что и диск 1, следовательно, номер стержня которого отличается от d. Этот самый диск перемещается со стержня, на котором он находится — с номером x — на стержень 3 - x– d.
Обозначим первое перемещение через 1. Поскольку диск 1 перемещается один раз в каждой паре ходов (точнее, перемещается через ход), то он перемещается в каждый нечетный ход. По индукции покажите, что диск p перемещается в ходы с номерами, которые делятся на 2р– 1, но не делятся на 2p (т. е. являются нечетными кратными числа 2p– 1).
Номер k любого хода может быть единственным способом представлен в виде
k = (2r + 1)2р– 1.
Перемещаемый на этом ходе диск есть диск с номером p, и это — его (r + 1)-е перемещение. Так как он начинает движение со стержня 0 и перемещается в направлении sp (1, если р нечетно, и 2 в противном случае), то на этом ходе диск перемещается с rsp– го на (r + 1)sр– й стержень, где эти числа берутся по модулю 3.
Игра 34.
Попытаемся охарактеризовать значение р, дающее игре оптимум для данного n. Нам известно, что f3(n– p)= 2n– p– 1.
Должно выполняться
2f4(p– 1) + 2n– p+1– 1 >= 2f4(р) + 2n– p– 1,
2f4(p + 1) + 2n– p-1– 1 >= 2f4(р) + 2n– p– 1.
Удобно пользоваться первыми
d(р) = f4(p + 1) - f4(p).
Два приведенных выше соотношения могут быть переписаны следующим образом:
d(p– 1) < 2n– p– 1, d(р) >= 2n– p-2.
Интересно рассматривать даже не d(р), а скорее 2pd(р) = g(р):
g(р– 1) ~ 2n– 2 <= g(р).
Можно еще упростить запись, беря не g(р), а величину
h(р) = log2(g(р)) = р + Iog2(d(р)).
Тогда получаем
h(р– 1) < n– 1 <= h(р).
При данном n величина р — наименьшее целое, для которого h больше или равно n– 2.
Приведем здесь первые из полученных таким образом значений:
n | q | f 4 | p | d | h |
0 | 0 | 0 | 1 | 0 | |
1 | 1 | 1 | 2 | 2 | |
2 | 3 | 2 | 3 | ||
3 | 2 | 5 | 1 | 4 | 5 |
4 | 9 | 1 | 4 | 6 | |
5 | 13 | 1 | 4 | 7 | |
6 | 3 | 17 | 3 | 8 | 9 |
7 | 25 | 3 | 8 | 10 | |
8 | 33 | 4 | 8 | 11 | |
9 | 41 | 5 | 8 | 12 | |
10 | 4 | 49 | 6 | 16 | 14 |
11 | 65 | 6 | 16 | 15 |