- 论坛徽章:
- 0
|
苦思冥想,得到汉诺塔问题的非递归算法,希望能够抛砖引玉,或者得到批评指正。
汉诺塔问题的搬运过程可以看成一个想象中的二叉树的中序遍历,从而可得如下的算法:
#include <stdio.h>;
struct stackNode{
int layer;
int from;
int to;
};
int hanoi(int layers)
{
struct stackNode stack[20];
int layer, top=0, from=0, to=2, i=1;
layer = layers-1;
stack[top].layer = layer;
stack[top].from = from;
stack[top].to = to;
while(top+1){
while(layer){
top++;
layer--;
to = (6-from-to)%3;
stack[top].layer = layer;
stack[top].from = from;
stack[top].to = to;
}
if(top+1){
printf("%3d. %d--%d->;%d\n", i, stack[top].from, stack[top].layer, stack[top].to);
i++;
top--;
if(top+1){
printf("%3d. %d--%d->;%d\n", i, stack[top].from, stack[top].layer, stack[top].to);
i++;
layer = stack[top].layer-1;
to = stack[top].to;
from = (6-stack[top].from-to)%3;
stack[top].layer = layer;
stack[top].from = from;
stack[top].to = to;
}
}
}
} |
|