GameDev ВолгоградаФорум

Помогите, пожалуйста (Ханойские башни).

#0
20:58, 7 янв 2006

Помогите, пожалуйста. Не могу написать программу «Ханойские башни», хоть убей (возможно, меня просто заклинило).

Нужно в двух видах: с рекурсией и без нее.
Задачи должны быть решены в общем виде, т.е. число дисков – n.

Поскольку решенная задача это не интересно, прошу только подсказать, если и это не поможет то…. не будем о плохом.

Заранее спасибо.
Dmitriy.

#1
20:59, 7 янв 2006

Где тут закономерность (пять колец)?

Перемещение (n-1) диск со стойки 1 на стойку 3 используя 2
1>2
1>3
2>3
1>2
3>1
3>2
1>2
1>3
2>3
2>1
3>1
2>3
1>2
1>3
2>3
------------------------
Перемещение последнего диска
1>2
------------------------
Перемещение (n-1) диск со стойки 3 на стойку 2 используя 1
3>1
3>2
1>2
3>1
2>3
2>1
3>1
3>2
1>2
1>3
2>3
1>2
3>1
3>2
1>2

#2
17:57, 11 янв 2006

Ну как, решил с рекурсией?

#3
20:59, 2 фев 2006

Наконец-то!
Мне все-таки нашли, даже дали (это совершенно невероятно для нашего учителя) книжку «Московские олимпиады по программированию» (правда 1990г.). Но самое обидное – все лекции и все задачи на Pascal, который я к сожаления или к счастью терпеть не могу.
Там есть раздел – рекурсии (со звездочкой - *). Кое-как ее там объясняют (если бы я с ней столкнулся впервые, то не понял бы ничего) и даже, как ни странно, дается решение одной задачи – «Ханойские башни». Вот оно:

Program hanoj;
var n: integer;
procedure p(m, a, b, c);
begin if m = 1 then write(a.,’>’,b,’ ’)
    else begin p(m-1, a, c, b); p(1, a, b, c); p(m-1, c, b, a); end;
end;
begin readln(n); write(‘n = ‘, n); p(n, 0 , 1, 2);
end.

Т.к. в школе мы еще не проходили процедуры Pascal, то я программу до конца не понимаю. Подошел к учителю и услышал гениальную фразу, которая меня сразила наповал: «да откуда же я знаю». Покопался в интернете и понял, что процедуры в Pascal пишутся до самой программы (после Си для меня это несколько странно). Покопался я еще и понял, что программа практически не интерактивная:
- Число дисков, которое следует переместить (это благо есть)
- Стойка, на которой первоначально находились диски (нет)
- Стойку на которую нужно перемесить диски (нет)
Итог: у меня есть не доделанная программа на Pascal, к которой я не могу, к сожалению, сделать эквивалент.

Прошу подсказать: что мне делать и как мне быть?
Спасибо.

#4
10:02, 3 фев 2006

http://algolist.manual.ru/maths/combinat/hanoi.php
Вот. Может поможет.

#5
23:24, 4 фев 2006

ZKiNNER
Я посмотрел, вроде должно помочь.
Спасибо.

GameDev ВолгоградаФорум

Тема в архиве.