汉诺塔非递归算法.我只是将盘子的数量等于2,3的情况代到网上别人给的算法中验证了一下,没有错。并没有证明算法的正确性。算法是否有效,有待大家证明。 H-%v3d>3
-hV*EPQ/
include <iostream> ]?)TdJ`
#include <stdlib.h> <Qq*p
C>~TI,5a3
#ifdef _WIN32 /> Nt[o[r
using namespace std; *kVV+H<X|b
#endif b\ PgVBf9
@KA4N`
static void hanoi(int height) V:27)]q
{ ]~%6JJN7
int fromPole, toPole, Disk; jtc~DL
int *BitStr = new int[height], //用来计算移动的盘的号码 !+ njS
*Hold = new int[height]; //用来存贮当前的盘的位置。hold[0]为第一个盘所在的柱号 >MK98(F
char Place[] = {'A', 'C', 'B'}; {U1m.30n
int i, j, temp; *J{+1Ev~$p
l]cFqLp
for (i=0; i < height; i++) to\Ni~a&
{ CJ%I51F`X
BitStr = 0;
9akH
Hold = 1; x :7IIvP
} {|\.i
temp = 3 - (height % 2); //第一个盘的柱号 bi:8(Q$w:`
int TotalMoves = (1 << height) - 1; iOdpM{~*
for (i=1; i <= TotalMoves; i++) fQ98(+6
{ +O5hH8<&b
for (j=0 ; BitStr[j] != 0; j++) //计算要移动的盘 V+~Nalm O
{ +>9Q/E
BitStr[j] = 0; ap~^Ty<>
} Ewm9\qmg
BitStr[j] = 1; GF
WA>5n'
Disk = j+1; p#[.{
if (Disk == 1) {PmZ9
{ aoTP[Bp
fromPole = Hold[0]; f-2c0Bi
toPole = 6 - fromPole - temp; //1+2+3等于6,所以6减去其它两个,剩下那个就是要移去的柱子 tjnIN?YT
temp = fromPole; //保存上一次从哪个柱子移动过来的 80;(Gt@<"
} }`"6aM
else X?$_Sd"G+5
{ <t,x RBk
fromPole = Hold[Disk-1]; ZB&6<uw
toPole = 6 - Hold[0] - Hold[Disk-1]; MfQ!6zE
} L+QLLcS~EM
cout << "Move disk " << Disk << " from " << Place[fromPole-1] Fx+*S3==%e
<< " to " << Place[toPole-1] << endl; Ev P{p
Hold[Disk-1] = toPole; EzIGz[
} i LAscb
} TPY}C
JLi|Td"1%
ty`DJO=Omj
;6wA"
'QIqBU'~
int main(int argc, char *argv[]) n(|^SH4$b
{ %IRi1EmN8
cout << "Towers of Hanoi: " << endl ]:f%l
mEy
<< "moving a tower of n disks from pole A to pole B by using pole C" << endl; \L\b $4$d
cout << "Input the height of the original tower: "; 0RK!/:'
int height; D0q":WvE
cin >> height; |I|fMF2K
hanoi(height); 9,tej
*,m;
system("PAUSE"); XrPfotj1
return EXIT_SUCCESS; F>cv<l
=6l
} @K]|K]cby
]fD}
^s3G
8*fv'
:eg4z )
问题描述:有三个柱子A, B, C. A柱子上叠放有n个盘子,每个盘子都比它下面的盘子要小一点,可以从上 )Wox Mmz
Z<4AL\l 98
到下用1, 2, ..., n编号。要求借助柱子C,把柱子A上的所有的盘子移动到柱子B上。移动条件为:1、一
^I)N. 5
_~
&iq1
次只能移一个盘子;2、移动过程中大盘子不能放在小盘子上,只能小盘子放在大盘子上。 <9%R\_@$H
BSMwdr
算法要点有二: V_:&S2j
1、确定哪一个盘子要移动。有n个盘子的Hanoi塔需要移动2^n -1次,设m为n位的二进制数,则m的取值范 :h V7>
rr
\G3rX9xG
围为0~2^n -1。让m每次递增1,可以发现,m中最低一位的刚刚由0变为1的位置的位置编号,和即将要移 X|8c>_}
F/A|(AH'
动的盘子编号有确定关系。 Ow077v?
9E6R0D}
2、这个盘子往哪个柱子上移。 pD74+/DD
a.第一次需要移动1号盘,n为奇数时,1号盘首先移动到柱子B,为偶数时首先移动到柱子C。 Bnd [X
b.接下来如果移动的盘子不是1号盘。你有两个柱子可以选择。先找到1号盘所在的柱子,因为移动的盘子 f`/x"@~H5
,iq4Iw
不能叠放到1号盘上,所以该盘可以移动的位置就是没有1号盘的那个柱子。 t_suF$
c.如果移动的盘子是1号盘。也有两个柱子可以选择。找到1号盘原先是从哪个柱子上移来的,因为移动的 Ki~1qu:
j w9b)
顺序(顺时针或逆时针)一旦确定,就不会更改,所以排除from的那个柱子后,移动方向也就唯一了。