53
{
if (k>0)
{
Hanoj(d1,d3,d2,k-1);
//
переместить кольцо со стержня d1 на стержень
d2
//
отобразить
Hanoj(d3,d2,d1,k-1);
}
}
В этой функции пока не прописаны два действия:
−
переместить кольцо со стержня d1 на стержень
d2,
− отобразить.
Конкретный вид этих действий зависит от способа представления дан-
ных, в частности результата выполнения функции. Мы
ставим своей целью
получить графическую иллюстрацию выполнения алгоритма.
Для рисования башен необходимо знать, сколько колец и какого разме-
ра лежит на каждом стержне. Поскольку по правилам игры брать со стержня
можно
только верхнее кольцо, класть кольцо
можно только на верхушку
стержня, то естественно в качестве структуры
для хранения информации о
кольцах на стержнях выбрать стек. В соответствии с условием задачи необ-
ходимо иметь три одинаковых стека. Мы реализуем это в виде массива сте-
ков
ArSt. Каждый из стеков представляет собой экземпляр класса
MyStack,
имеющего методы добавления и извлечения элементов. Данный класс описан
в главе 8 книги «C#. Введение в программирование».
В стек помещаются целые числа, величина числа соответствует разме-
ру кольца. Каждый стержень имеет свой стек. И тогда перемещение кольца с
одного стержня на другой эквивалентно извлечению числа из одного стека и
помещению его в другой стек. После каждого
перемещения кольца отобра-
жаются башни. Функция
Hanoj() с детализацией действия по перемещению
кольца приведена в листинге 3.5.
Листинг 3.5. Ханойские башни. Основная функция
void Hanoj(int d1,int d2,int d3, //
стержни
int k) //
количество колец
7 / 23
54
{
if (k>0)
{
Hanoj(d1,d3,d2,k-1);
int e = ArSt[d1].PopStack();//
кольцо диа-
метром e берется со стержня d1
ArSt[d2].PushStack(e); //
кольцо кла-
дется на стержень d2
Drawing();
//
отображение
стержней
Hanoj(d3,d2,d1,k-1);
}
}
Создадим проект, иллюстрирующий работу по перекладыванию колец.
Форма проекта показана на рисунке 3.4. На
ней представлен завершающий
этап работы: 5 колец со стержня 1 перемещены на стержень 2. На форме раз-
мещены следующие элементы управления:
− текстовое поле для ввода числа колец;
− кнопка
buttonRun, активизирующая процедуру
Hanoj();
− кнопка
buttonClear, удаляющая старый рисунок.
Рис. 3.4. Форма проекта «Ханойские башни»
8 / 23