Назовем столбики A,B,C (A в начале непустой).
Введем операции:
А->С() - переложить один диск с А на С
top(A), top(C) - размер верхнего диска А или С. Если столбик пуст, то этот размер - MaxInt.
В->С(К) - переложить с В на С все диски, размер которых меньше К (мы это можем сделать, если верхие диски А и С не меньше К)
swap() - переставить столбики В и С (или переименовать их- нам ведь все равно, где окажутся диски)
while(A) - цикл пока А не пуст.
Тогда работает такой алгоритм:
while(A){
K=top(A);
while(top(C) < K){
B->C(top(C));
swap();
}
A->C();
}
while(C){
B->C(top(C));
swap();
}