У меня вопрос по линейным башням Ханоя.
Я реализовал это на С++, но пытаюсь сделать то же самое, используя хвостовой рекурсивный или итеративный метод. У меня проблемы с алгоритмом.
Этот фрагмент кода показывает перемещение блоков из средней башни в конечную.
#include <stdlib.h>
#include <stdio.h>
using namespace std;
//int a[5]={2,3,1,2,1};
int from,spare,to;
int main()
{
//int n;
//void hanoi(int,int,int,int);
void linear_hanoi(int,int,int,int);
void mid_to_end(int,int,int,int);
void end_to_mid(int,int,int,int);
//mid_to_end(3,2,3,1);
end_to_mid(4,3,2,1);
getchar();
return 0;
}
void linear_hanoi(int n, int from, int to, int spare)
{
if(n>0)
{
linear_hanoi(n-1,from,to,spare);
cout<<"move ring "<<n<<" from tower "<<from<<" to tower "<<spare<<endl;
linear_hanoi(n-1,to,from,spare);
cout<<"move ring "<<n<<" from tower "<<spare<<" to tower "<<to<<endl;
linear_hanoi(n-1,from,to,spare);
}
}
void mid_to_end(int n, int from, int to, int spare)
{
if(n>0)
{
mid_to_end(n-1,from,spare,to);
cout<<"move ring "<<n<<" from tower "<<from<<" to tower "<<to<<endl;
// mid_to_end(n-1,spare,from,to);
// mid_to_end(n-1,from,to,spare);
//cout<<"move ring "<<n<<" from tower "<<spare<<" to tower "<<from<<endl;
// mid_to_end(n-1,from,to,spare);
//cout<<"move ring "<<n<<" from tower "<<spare<<" to tower "<<from<<endl;
}
}
Что я делаю не так?
2 ответа
Из википедии:
Простое решение: Следующее решение является простым решением для игрушечной головоломки.
Попеременные ходы между самой маленькой фигурой и не самой маленькой фигурой. При перемещении наименьшей части всегда двигайте ее в одном направлении (вправо, если начальное количество частей четное, влево, если начальное количество частей нечетное). Если в выбранном направлении башни нет, переместите фигуру в противоположный конец, но затем продолжайте движение в правильном направлении. Например, если вы начали с трех частей, вы должны переместить самую маленькую часть в противоположный конец, а затем продолжить движение в левом направлении. Когда очередь состоит в том, чтобы переместить не самую маленькую фигуру, разрешен только один ход. Это должно завершить головоломку, используя для этого наименьшее количество ходов.
Вы можете преобразовать код в стиль передачи продолжения. Тогда все хвост-рекурсивно...
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.