汉诺塔非递归算法.我只是将盘子的数量等于2,3的情况代到网上别人给的算法中验证了一下,没有错。并没有证明算法的正确性。算法是否有效,有待大家证明。 c"`CvQO64
{4HcecT
include <iostream> DkeFDzQ5
#include <stdlib.h> E6s)J -a
I+']av8e
#ifdef _WIN32 tZ_D.syBAc
using namespace std; ;Zw? tU
#endif h7o?z!
.%x%(olf
static void hanoi(int height) ] 5:0.$5
{ 8\$u/(DX
int fromPole, toPole, Disk; m 9.BU2.
int *BitStr = new int[height], //用来计算移动的盘的号码 L IRdWGQ4
*Hold = new int[height]; //用来存贮当前的盘的位置。hold[0]为第一个盘所在的柱号 Vae=Yg=fw
char Place[] = {'A', 'C', 'B'}; iJ!p9E*(
int i, j, temp; k/2TvEV3=
-=a,FDeR
for (i=0; i < height; i++) nn{PhyK
{ _?c7{
BitStr = 0; 4-~S"T8<u
Hold = 1; 6~!l7HqO
} oS#PBql4
temp = 3 - (height % 2); //第一个盘的柱号 noQS bI
@
int TotalMoves = (1 << height) - 1; 4ZrRgx2MD
for (i=1; i <= TotalMoves; i++) P,={ C6*
{ ja+PVf
for (j=0 ; BitStr[j] != 0; j++) //计算要移动的盘 @XN|R
{ L_Lhmtm}m
BitStr[j] = 0; @agxu-Y
} KU*XRZu)
BitStr[j] = 1; Q;y)6+VU4
Disk = j+1; 3u~V&jl
if (Disk == 1) %v,a3^Qu
{ $`6Q\=*R/
fromPole = Hold[0]; cOvdC4
toPole = 6 - fromPole - temp; //1+2+3等于6,所以6减去其它两个,剩下那个就是要移去的柱子 s1%th"e
[
temp = fromPole; //保存上一次从哪个柱子移动过来的 O("13cU
} 8>a%L?BY
else {P!1VYs5
{ 4O:y
?D/e
fromPole = Hold[Disk-1]; F8d:7`lO@/
toPole = 6 - Hold[0] - Hold[Disk-1]; gfly?)V nF
} c,FZ{O@
cout << "Move disk " << Disk << " from " << Place[fromPole-1] *`~]XM@H
<< " to " << Place[toPole-1] << endl; eizni\
Hold[Disk-1] = toPole; eR>|1s%^
} V&Q_iE
} fOt?2Bh
U~q2j#pJ
/uJ(W
G:i>MJbxT
nr- 32u
int main(int argc, char *argv[]) A Y_GD ^
{ /<T3^/ '
cout << "Towers of Hanoi: " << endl s&F&
*5W
<< "moving a tower of n disks from pole A to pole B by using pole C" << endl; ';KWHk8C
cout << "Input the height of the original tower: "; _Z_R\
int height; jkV9$W0
cin >> height; Y>SpV_H%
hanoi(height); w5*
Z\t5
s%i
\z }/
system("PAUSE"); 7&3
return EXIT_SUCCESS; H_>9'(
} |}isSCt
%abc-q
v?(z4oOD/>
(DY&{vudF
问题描述:有三个柱子A, B, C. A柱子上叠放有n个盘子,每个盘子都比它下面的盘子要小一点,可以从上 ]\(Ho
\IO<V9^L
到下用1, 2, ..., n编号。要求借助柱子C,把柱子A上的所有的盘子移动到柱子B上。移动条件为:1、一 XWag+K
L*(`ccU
次只能移一个盘子;2、移动过程中大盘子不能放在小盘子上,只能小盘子放在大盘子上。 G|.6%-
yyM`J7]J
算法要点有二: DLD 5>
1、确定哪一个盘子要移动。有n个盘子的Hanoi塔需要移动2^n -1次,设m为n位的二进制数,则m的取值范 $nr=4'yZ
vC!B}~RG
围为0~2^n -1。让m每次递增1,可以发现,m中最低一位的刚刚由0变为1的位置的位置编号,和即将要移 P`AW8Y6o
=2e{T J/
动的盘子编号有确定关系。 C_S2a0?
3wN{k\ns
2、这个盘子往哪个柱子上移。 \Sv8c}8
a.第一次需要移动1号盘,n为奇数时,1号盘首先移动到柱子B,为偶数时首先移动到柱子C。 @Io@1[k j
b.接下来如果移动的盘子不是1号盘。你有两个柱子可以选择。先找到1号盘所在的柱子,因为移动的盘子 '9@AhiNV
#T++5G
不能叠放到1号盘上,所以该盘可以移动的位置就是没有1号盘的那个柱子。 e5#?@}?
c.如果移动的盘子是1号盘。也有两个柱子可以选择。找到1号盘原先是从哪个柱子上移来的,因为移动的 IZ<Et/3H
=B0AG9Fz
顺序(顺时针或逆时针)一旦确定,就不会更改,所以排除from的那个柱子后,移动方向也就唯一了。