汉诺塔非递归算法.我只是将盘子的数量等于2,3的情况代到网上别人给的算法中验证了一下,没有错。并没有证明算法的正确性。算法是否有效,有待大家证明。 l\T!)Ql
w'oo-.k
include <iostream> J0ZxhxX35
#include <stdlib.h> .)"_Q/q
MG7 ?N #
#ifdef _WIN32 <THZ2`tTK3
using namespace std; M('s|>\l
#endif 7K>D@O
{)
:%WnM9
static void hanoi(int height) YGq=8p7.R
{ Snc;p
int fromPole, toPole, Disk; v"P&`1=T
int *BitStr = new int[height], //用来计算移动的盘的号码 74@lo-/LY
*Hold = new int[height]; //用来存贮当前的盘的位置。hold[0]为第一个盘所在的柱号 KP[NuXA`
char Place[] = {'A', 'C', 'B'}; KGV.S
int i, j, temp; 8)^B32
\)OZUch
for (i=0; i < height; i++) a|DsHZ^6^
{ Usa+b
A
BitStr = 0; nS_Ta
Hold = 1; }xAie(
} .]W;2G
temp = 3 - (height % 2); //第一个盘的柱号 qP~WEcH`[
int TotalMoves = (1 << height) - 1; Ds%9cp*6
for (i=1; i <= TotalMoves; i++) [[:UhrH-
{ C`\9cej
for (j=0 ; BitStr[j] != 0; j++) //计算要移动的盘 ~bdv_|k
{ 6g5PM4\
BitStr[j] = 0; ,:D=gQ@`
} J|VK P7
BitStr[j] = 1; $4Z+F#mx
Disk = j+1; T vrk^!
if (Disk == 1) 4p.^'2m
{ >_XOc
fromPole = Hold[0]; ~9Zh,p;
toPole = 6 - fromPole - temp; //1+2+3等于6,所以6减去其它两个,剩下那个就是要移去的柱子 6iG(C.b
temp = fromPole; //保存上一次从哪个柱子移动过来的 YEzU{J
} y|$R`P
else Q,{^S,s<
{ =M7TCE
fromPole = Hold[Disk-1]; "`pNH'
toPole = 6 - Hold[0] - Hold[Disk-1]; qAoAUDm
} LO)GTyzvJ
cout << "Move disk " << Disk << " from " << Place[fromPole-1] pmD4j8F_
<< " to " << Place[toPole-1] << endl; n-DaX
kK
Hold[Disk-1] = toPole; I%oRvg|q
} ebqg"tPN{
} 2
P=[
8p&kL