Страницы

вторник, 4 августа 2015 г.

Ханойские башни алгоритм

Разработка алгоритма решения игры Ханойские башни С++
Многие, наверное, знают эту игру. Есть три колышка, на первом стопка дисков, диаметр которых увеличивается к основанию стопки.


Необходимо переместить все эти диски на другой колышек. При этом нельзя перемещать одновременно более одного диска, нельзя класть больший диск над меньшим. Для временного размещения можно использовать третий колышек.
Эта задача решается очень просто – используем рекурсивную функцию. Рассмотрим сам алгоритм и реализацию в консольной программе на С++.
Допустим, нам необходимо переместить n дисков с колышка 1 на колышек 3.
При этом задача решается вот так:

  1. Переместить n-1 дисков с колышка 1 на колышек 2, используя колышек 3, как временное размещение.
  2. Переместить последний наибольший диск с колышка 1 на колышек3.
  3. Переместить n-1 дисков с колышка 2 на колышек 3, используя колышек 1, как временное размещение.
Процесс заканчивается, как только остается один колышек, то есть n=1. Последний диск просто перекладывается без временного размещения.
Составим рекурсивную функцию с 4 параметрами:
1 – количество дисков, которое нужно переместить;
2 – номер колышка, на котором они находятся;
3 – номер колышка, на который нужно переместить;
4 – номер временного колышка.
Программа должна печатать инструкцию, куда и откуда нужно перемещать диски, например:
1 => 3
Это значит, что нужно переместить диск с колышка 1 на колышек 3.
Для 3 дисков должен получиться результат:
1 => 3
1 => 2
3 => 2
1 => 3
2 => 1
2 => 3
1 => 3
Текст программы:
//программа Ханойские башни - алгоритм
#include <iostream>
using namespace std;
//рекурсивная функция
//m - число дисков, котоое нужно переместить
//a - Колышек, на котором находятся диски
//b - колышек, на который нужно переместить
//c - колышек временного размещения
void hanoy(int m, int a, int b, int c)
{
    if(m==0) return;
    hanoy(m-1, a, c, b);
    cout<<a<<" => "<<b<<endl;
    hanoy(m-1, c, b, a);
}

void main()
{
    int n = 3, x = 1, y = 2, z = 3;
    //необходимо переместить n дисков с 1 на 3 колышек, используя второй
    hanoy(n, x, z, y);
    cin.get();
    return;
}
Результат выполнения: