#define DEEP 20 // Максимальная глубина стека
void hanoi(short a, // Исходная площадка
short b, // Площадка - цель
short n){ // Число дисков
short stack[DEEP][3],
i, // Индикатор уровня стека
fl; // 0 – стек пуст. Конец вычислений
fl = 1;
i = -1;
while(fl){
if(n > 1){ // Заполнение стека
i++;
stack[ i ][0] = a;
stack[ i ][1] = b;
stack[ i ][2] = n;
/* Подготовить первое обращение */
b = 6-a-b;
n--;
}else{
if(i >= 0){// Стек не пуст
/* Печать вершины уровня 1 */
printf(" %2d %2d\n", a, b);
/* Извлечь данные из стека */
a = stack[ i ][0];
b = stack[ i ][1];
n = stack[ i ][2];
/* Печать "корня" */
printf(" %2d %2d\n", a, b);
/* Подготовить второе обращение */
a = 6-a-b;
n--;
/* Убрать вершину из стека */
i--;
}else{ // Стек пуст
fl = 0;
}
}
} // End while
/* Печать последней вершины */
printf(" %2d %2d\n", a, b);
} // End hanoi