汉诺塔非递归算法.我只是将盘子的数量等于2,3的情况代到网上别人给的算法中验证了一下,没有错。并没有证明算法的正确性。算法是否有效,有待大家证明。 <A.W 8b7D
="d*E/##
include <iostream> dz[
bm<T7
#include <stdlib.h> 1w"8~Z:UXV
D.%B$Y;G
#ifdef _WIN32 "<i SZ
using namespace std; CD0VfA>Z
#endif )RsM!}
Xe+,wW3YF
static void hanoi(int height) LC0d/hM
{ s9oO%e<
int fromPole, toPole, Disk; LG]3hz9^9
int *BitStr = new int[height], //用来计算移动的盘的号码 &5t :H 8b
*Hold = new int[height]; //用来存贮当前的盘的位置。hold[0]为第一个盘所在的柱号 -xD*tf*
char Place[] = {'A', 'C', 'B'}; aV1lJ;0
int i, j, temp; %/.a]j!
,pBh`av
for (i=0; i < height; i++) T$=4O9G
{ 90xk$3(
BitStr = 0; BN,>&1I
Hold = 1; lHB) b}7E
} {k(eNr,
temp = 3 - (height % 2); //第一个盘的柱号 A*tKF&U5
int TotalMoves = (1 << height) - 1; 2ij#
H
;
for (i=1; i <= TotalMoves; i++) F%rHU5CkV
{ 8Q)@
for (j=0 ; BitStr[j] != 0; j++) //计算要移动的盘 26n^Dy>}
{ ^ZTGJ(j7~
BitStr[j] = 0; ,1/}^f6
} [4J6iF
BitStr[j] = 1; H@uE>
Disk = j+1; EC6k{y}bA
if (Disk == 1) :"o
o>
{ 8p1ziz`4>$
fromPole = Hold[0]; @$eT~ C
toPole = 6 - fromPole - temp; //1+2+3等于6,所以6减去其它两个,剩下那个就是要移去的柱子 /hv#CB>1x
temp = fromPole; //保存上一次从哪个柱子移动过来的 4l8BQz}sb
} GYB+RU}],
else 9F;S+)H4
{ JmpsQ,,
fromPole = Hold[Disk-1]; Pgp {$ID
toPole = 6 - Hold[0] - Hold[Disk-1]; V84*0&q