汉诺塔非递归算法.我只是将盘子的数量等于2,3的情况代到网上别人给的算法中验证了一下,没有错。并没有证明算法的正确性。算法是否有效,有待大家证明。 (qXl=e8
*Me{G y
include <iostream> P _3U4J
#include <stdlib.h> !`F^LXGA
;Q} H'Wg,
#ifdef _WIN32 jW!)5(B[A
using namespace std; O:3DIT1#>
#endif |Zrkk>GW:
b5Pakz=jNM
static void hanoi(int height) f.SmCgG
{ z("Fy
int fromPole, toPole, Disk; vswBK-w(Z
int *BitStr = new int[height], //用来计算移动的盘的号码 fnm:Wa|,%|
*Hold = new int[height]; //用来存贮当前的盘的位置。hold[0]为第一个盘所在的柱号 xg2
&
char Place[] = {'A', 'C', 'B'}; '+{dr\nJ
int i, j, temp; <<[hZ$.
<"XDIvpc%L
for (i=0; i < height; i++) /i)1BaF
{ YKsc[~
h
BitStr = 0; ^U4|TR6mub
Hold = 1; _z3YB
} @UidQX"b
temp = 3 - (height % 2); //第一个盘的柱号 19t'
int TotalMoves = (1 << height) - 1; qW6}^aa
for (i=1; i <= TotalMoves; i++) d(-$ {
c
{ ?nAKB5=
for (j=0 ; BitStr[j] != 0; j++) //计算要移动的盘 9&`ejeD
{ ^."HD(
BitStr[j] = 0; pD>^Dfd
} K2GcU_*t
BitStr[j] = 1; N%.DjH
Disk = j+1; 1"82JN|!
if (Disk == 1) 9k@`{+wmZ
{ WrGz`
fromPole = Hold[0]; *t+E8)qL
toPole = 6 - fromPole - temp; //1+2+3等于6,所以6减去其它两个,剩下那个就是要移去的柱子 32sb$|eQq
temp = fromPole; //保存上一次从哪个柱子移动过来的 HKdR?HM1
} _~ipO1*
else bu2'JIDR
{ E |A,NPf%I
fromPole = Hold[Disk-1]; Hf'yRKACj
toPole = 6 - Hold[0] - Hold[Disk-1]; FiQx5}MMhu
} p3NTI /-
cout << "Move disk " << Disk << " from " << Place[fromPole-1] -^JGa{9*
<< " to " << Place[toPole-1] << endl; Xkv+"F=-
Hold[Disk-1] = toPole; 6/#5TdJA
} z4nVsgQ$
} S}hg*mWn{$
S0ct;CS
c[Mz#BWG
(1vmtg.O
ZREAEGi{
int main(int argc, char *argv[]) fV;&)7d&
{ X&<