汉诺塔非递归算法.我只是将盘子的数量等于2,3的情况代到网上别人给的算法中验证了一下,没有错。并没有证明算法的正确性。算法是否有效,有待大家证明。 .W&rcqy
9D_4]'KG
include <iostream> KV0e^c;
#include <stdlib.h> \(LHcvbb
F#^ .L|d4
#ifdef _WIN32 ;D[b25
using namespace std; jL)aU> kN
#endif 5\tYs=>b<
yXw xq(32
static void hanoi(int height) BI=Ie?
{ yREO;m|o
int fromPole, toPole, Disk; kc8T@5+I0
int *BitStr = new int[height], //用来计算移动的盘的号码 %;PPu$8K9
*Hold = new int[height]; //用来存贮当前的盘的位置。hold[0]为第一个盘所在的柱号 !`='K
+
char Place[] = {'A', 'C', 'B'}; ~4*9w3t
int i, j, temp; 1W
HR;!u
? F fw'O
for (i=0; i < height; i++) $/45*
{ !{SU G+.2
BitStr = 0; @11voD
Hold = 1; ?kb\%pcK
} k 9Kv
temp = 3 - (height % 2); //第一个盘的柱号 6SsZK)X
int TotalMoves = (1 << height) - 1; t Q_}o[
for (i=1; i <= TotalMoves; i++) M42D5|tZc
{ W^&t8d2
for (j=0 ; BitStr[j] != 0; j++) //计算要移动的盘 s:cS 9A8
{ Q;5'I3w
BitStr[j] = 0; k<W]VS3N
} ld[]f*RuW
BitStr[j] = 1; NnSI=M
Disk = j+1; uW[s?
if (Disk == 1) {M E|7TS=
{ qr=U=oK
fromPole = Hold[0]; 4[.-
a&!}
toPole = 6 - fromPole - temp; //1+2+3等于6,所以6减去其它两个,剩下那个就是要移去的柱子 3g|O2>*?
temp = fromPole; //保存上一次从哪个柱子移动过来的 >e-XZ2>Sj
} L*h X_8J
else 1xq1te)
{ Yjk A^e
fromPole = Hold[Disk-1]; }.zgVLL
toPole = 6 - Hold[0] - Hold[Disk-1]; o<P%|>qX
} L +. K}w
cout << "Move disk " << Disk << " from " << Place[fromPole-1] G68N@g
<< " to " << Place[toPole-1] << endl; h/(9AO}t
Hold[Disk-1] = toPole; 3[aJ=5
} i$:CGUb
} x_Ais&Gc
r?/>t1Z
HNjkRl)QR
2 >xV&