汉诺塔非递归算法.我只是将盘子的数量等于2,3的情况代到网上别人给的算法中验证了一下,没有错。并没有证明算法的正确性。算法是否有效,有待大家证明。 7X
h'VOljB
@l7~Zn
include <iostream> mVg$z
#include <stdlib.h> Hh_Yd)
d-=RS]j;j
#ifdef _WIN32 wj-=#gyAoo
using namespace std; }9&Z#1/
#endif y"Fp4$qb
2yu\fu
static void hanoi(int height) _vQtV]
{ %S G**7
int fromPole, toPole, Disk; 5BSh`r
int *BitStr = new int[height], //用来计算移动的盘的号码 uM!$`JN
*Hold = new int[height]; //用来存贮当前的盘的位置。hold[0]为第一个盘所在的柱号 F~;G[6}
char Place[] = {'A', 'C', 'B'}; -6URM`y'j
int i, j, temp; )ZU)$dJ>V
K3uNR w
for (i=0; i < height; i++) #kO.'oIl
{ {*gO1TZt9
BitStr = 0; N$8do?
Hold = 1; OF$0]V
} [Yo3=(7J
temp = 3 - (height % 2); //第一个盘的柱号 j.? '*?P
int TotalMoves = (1 << height) - 1; AY{-Hf&
for (i=1; i <= TotalMoves; i++) 9~bl
{ PGaB U3
for (j=0 ; BitStr[j] != 0; j++) //计算要移动的盘 zYCrfr
{ :[;]6;
BitStr[j] = 0;
1o&]=(
} IFrq\H0
BitStr[j] = 1; %\5wHT+)
Disk = j+1; MIblx
if (Disk == 1) ^6tcB* #A
{ l98.Hb7
fromPole = Hold[0]; 4eZ
toPole = 6 - fromPole - temp; //1+2+3等于6,所以6减去其它两个,剩下那个就是要移去的柱子 &