汉诺塔非递归算法.我只是将盘子的数量等于2,3的情况代到网上别人给的算法中验证了一下,没有错。并没有证明算法的正确性。算法是否有效,有待大家证明。 QbpRSdxy`$
5/Swn9vwl
include <iostream> l=bB,7gL
#include <stdlib.h> $NJi]g|<3
?u 9)
GJO[
#ifdef _WIN32 #!9aTp).AL
using namespace std; #p*OLQ3~
#endif f{5)yZ`J*
ZK_IK)g
static void hanoi(int height) `^(6{p ?
{ USe"1(|E
int fromPole, toPole, Disk; [#uX{!q'
int *BitStr = new int[height], //用来计算移动的盘的号码 h^34{pKDn
*Hold = new int[height]; //用来存贮当前的盘的位置。hold[0]为第一个盘所在的柱号 Wu:vO2aw8
char Place[] = {'A', 'C', 'B'}; IN`05 Q
int i, j, temp; bIe>j*VPh@
)"|g&=
for (i=0; i < height; i++) .U9NQwd
{ {EZ
;
BitStr = 0; >MS}7Hk\
Hold = 1; \wO)w@"
} fd*=`+P
temp = 3 - (height % 2); //第一个盘的柱号 A3yVT8
int TotalMoves = (1 << height) - 1; D
OPOzh
for (i=1; i <= TotalMoves; i++) tSE6m -
{ 7f[nNng
for (j=0 ; BitStr[j] != 0; j++) //计算要移动的盘 %+FM$xyJ
{ ObMsncn
BitStr[j] = 0; >x&$lT{OY
} #j iQa"
BitStr[j] = 1; S
#&HB
Disk = j+1; C6CX{IA]
if (Disk == 1) NZ9`8&93
{ m->
chOu~|
fromPole = Hold[0]; lb`P9mbr+
toPole = 6 - fromPole - temp; //1+2+3等于6,所以6减去其它两个,剩下那个就是要移去的柱子 dg/7?gV
temp = fromPole; //保存上一次从哪个柱子移动过来的 mkrvWZjZX
} / D#vs9S
else (Qq! u
{ ]Fl+^aLS
fromPole = Hold[Disk-1]; $:/y5zi
toPole = 6 - Hold[0] - Hold[Disk-1]; 7:{4'Wr@6|
} ^*%p]r
cout << "Move disk " << Disk << " from " << Place[fromPole-1] X&
O
o1y
<< " to " << Place[toPole-1] << endl; 9"_qa q
Hold[Disk-1] = toPole; B2WPjhzD
} 5|S|HZ8G
} H&3VPag
.Eh~$wm
L'"20=sf
)|uPCZdLZ
I2YQIY+
int main(int argc, char *argv[]) _BtppQIWv
{ 5j{o0&=_$
cout << "Towers of Hanoi: " << endl '1=/G7g
<< "moving a tower of n disks from pole A to pole B by using pole C" << endl; Ai(M06P:h
cout << "Input the height of the original tower: "; vlp]!7v
int height; ,^:Zf|V
cin >> height; 4h:Oo
hanoi(height); $axaI$bE
#}:VZ2Z
system("PAUSE"); ~;wSe[
return EXIT_SUCCESS; m\"M`o
B
} |>jlY|
}1z=
C<
g^}X3NUn
@<W"$_r-
问题描述:有三个柱子A, B, C. A柱子上叠放有n个盘子,每个盘子都比它下面的盘子要小一点,可以从上 aE1h0`OT
(U/ 6~r'.L
到下用1, 2, ..., n编号。要求借助柱子C,把柱子A上的所有的盘子移动到柱子B上。移动条件为:1、一 P]]9Sqo7
H Y.,f_m
次只能移一个盘子;2、移动过程中大盘子不能放在小盘子上,只能小盘子放在大盘子上。 s-k~_C>Fw
@T?:[nPf&F
算法要点有二: R:0Fv9bwS
1、确定哪一个盘子要移动。有n个盘子的Hanoi塔需要移动2^n -1次,设m为n位的二进制数,则m的取值范 im*QaO%a4
$J=9$.4"
围为0~2^n -1。让m每次递增1,可以发现,m中最低一位的刚刚由0变为1的位置的位置编号,和即将要移 2=(=Wjk.
o
PR^Z
pt
动的盘子编号有确定关系。 Ibd7[A\
jR}h3!
2、这个盘子往哪个柱子上移。 1nBE8
N
a.第一次需要移动1号盘,n为奇数时,1号盘首先移动到柱子B,为偶数时首先移动到柱子C。 Xb)XV$0
b.接下来如果移动的盘子不是1号盘。你有两个柱子可以选择。先找到1号盘所在的柱子,因为移动的盘子 !i.`m-J*
:*1|ERGoay
不能叠放到1号盘上,所以该盘可以移动的位置就是没有1号盘的那个柱子。 ,;GWn
c.如果移动的盘子是1号盘。也有两个柱子可以选择。找到1号盘原先是从哪个柱子上移来的,因为移动的 k-b_
<Tbo|
_GI [SzD
顺序(顺时针或逆时针)一旦确定,就不会更改,所以排除from的那个柱子后,移动方向也就唯一了。