汉诺塔非递归算法.我只是将盘子的数量等于2,3的情况代到网上别人给的算法中验证了一下,没有错。并没有证明算法的正确性。算法是否有效,有待大家证明。 X+\=dhn69
Xa'b@*o&
include <iostream> #8v l2qWbi
#include <stdlib.h> #K-O<:s=y
?*q-u9s9
#ifdef _WIN32 +4IaX1.
using namespace std; Y,4?>:39J
#endif S}/ZHo
Wb^g{F!W
static void hanoi(int height) j=Q ?d]
{ 6h[fk.W_
int fromPole, toPole, Disk; `ST;";7!
int *BitStr = new int[height], //用来计算移动的盘的号码 T-oUcuQB
*Hold = new int[height]; //用来存贮当前的盘的位置。hold[0]为第一个盘所在的柱号 1TN+pmc}@
char Place[] = {'A', 'C', 'B'}; TuwSJS7
int i, j, temp; bM
W}.v!
Hb$wawy<
for (i=0; i < height; i++) YpSK|(
{ \rbvlO?}
BitStr = 0; WR*<|
Hold = 1; W H+Sd
} `LTD|0;
temp = 3 - (height % 2); //第一个盘的柱号 Ao9=TC'v$'
int TotalMoves = (1 << height) - 1; &:C(,`~
for (i=1; i <= TotalMoves; i++) <;Td8T;
{ _>{"vY
for (j=0 ; BitStr[j] != 0; j++) //计算要移动的盘 Oh=Kl3xs
{ 2+\@0j[q
BitStr[j] = 0; nhq,Y0YH
} Eo<N
BitStr[j] = 1; >ufN[ab
Disk = j+1; _cc9+o
if (Disk == 1) =fK F#^E@
{ &nn+X%m9g
fromPole = Hold[0]; i"M$hXO
toPole = 6 - fromPole - temp; //1+2+3等于6,所以6减去其它两个,剩下那个就是要移去的柱子 v kW2&
temp = fromPole; //保存上一次从哪个柱子移动过来的
(Vy`u)gG
} BMbZ34^e
else }~NWOJ3;
{ 3q (]Dg;v
fromPole = Hold[Disk-1]; d
a.6Z!a
toPole = 6 - Hold[0] - Hold[Disk-1]; r}XsJ$
} M|'![]-
cout << "Move disk " << Disk << " from " << Place[fromPole-1] }/-TT0*6j<
<< " to " << Place[toPole-1] << endl; X&