汉诺塔非递归算法.我只是将盘子的数量等于2,3的情况代到网上别人给的算法中验证了一下,没有错。并没有证明算法的正确性。算法是否有效,有待大家证明。 0fE?(0pBj
;r?s7b/>
include <iostream> SR>(GQ,m0;
#include <stdlib.h> Jo'~oZ$
(! a;}V<7
#ifdef _WIN32 R/EpfYOX
using namespace std; 4p<c|(f#
#endif i4Da 'Uk
Fa0Fl}L
static void hanoi(int height) uxx(WS
{ !:2_y'hA
int fromPole, toPole, Disk; fD3>g{
int *BitStr = new int[height], //用来计算移动的盘的号码 F81Kxcs
*Hold = new int[height]; //用来存贮当前的盘的位置。hold[0]为第一个盘所在的柱号 U5:5$T,C
char Place[] = {'A', 'C', 'B'}; U2G[uDa;
int i, j, temp; pL5Bz!_r
PjE%_M<
for (i=0; i < height; i++) 7x=-1wbi
{ |Ml~_m
BitStr = 0; y3@m1>]09
Hold = 1; O%s7 }bR3
} >zX`qv&>
temp = 3 - (height % 2); //第一个盘的柱号 dt5`UBvUg
int TotalMoves = (1 << height) - 1; &0x;60b
for (i=1; i <= TotalMoves; i++) VV-%AS6;
{ HC!5AJ&+}v
for (j=0 ; BitStr[j] != 0; j++) //计算要移动的盘 7<0oK|~c#
{
y?'Z'
BitStr[j] = 0; blx"WVqo
} 0u}+n+\g
BitStr[j] = 1; lk4U/:
Disk = j+1; ^]k=*>{
R
if (Disk == 1)
VXPsYR&
{ Ju-#F@38
fromPole = Hold[0]; D4jZh+_|S
toPole = 6 - fromPole - temp; //1+2+3等于6,所以6减去其它两个,剩下那个就是要移去的柱子 lw`$(,
temp = fromPole; //保存上一次从哪个柱子移动过来的 m^$KDrkD
} K |^OnM
else p'4ZcCW?f
{ T
s9go
fromPole = Hold[Disk-1]; ZFC&&[%-sG
toPole = 6 - Hold[0] - Hold[Disk-1]; @rE+H
5
} @yNCWa~N
cout << "Move disk " << Disk << " from " << Place[fromPole-1] Z{^Pnit
<< " to " << Place[toPole-1] << endl; }hA)p:
Hold[Disk-1] = toPole; Lvb'qZ6n
} h'B0rVQia>
} Pd+Wb3
Ow0( q^H<
U!b~vrr^
KBI36=UV
NQx>u
int main(int argc, char *argv[]) eIcIl2
{ @NYlVk2
cout << "Towers of Hanoi: " << endl .h-k*F0Ga)
<< "moving a tower of n disks from pole A to pole B by using pole C" << endl; goZw![4l
cout << "Input the height of the original tower: "; >p29|TFbV
int height; ]#;u]
cin >> height; vhrURY.
hanoi(height); =>*9"k%m
LG
vPy
system("PAUSE"); *5mJA -[B+
return EXIT_SUCCESS; T5eJIc3a"
} ^S:I38gR#q
QSx4M
u}-)ywX
v*&WqVg
问题描述:有三个柱子A, B, C. A柱子上叠放有n个盘子,每个盘子都比它下面的盘子要小一点,可以从上 2OwO|n
ow9Vj$m
到下用1, 2, ..., n编号。要求借助柱子C,把柱子A上的所有的盘子移动到柱子B上。移动条件为:1、一 OouR4
YR"IPyj
次只能移一个盘子;2、移动过程中大盘子不能放在小盘子上,只能小盘子放在大盘子上。 (m() r0:@
2Uy}#n|)r
算法要点有二: r)gtx!bx
1、确定哪一个盘子要移动。有n个盘子的Hanoi塔需要移动2^n -1次,设m为n位的二进制数,则m的取值范 & &:ZY4`
Ubv_a
围为0~2^n -1。让m每次递增1,可以发现,m中最低一位的刚刚由0变为1的位置的位置编号,和即将要移 Zr|\T7w 3
T^@P.zX
动的盘子编号有确定关系。 `aL4YH-v
iza.' Mm~
2、这个盘子往哪个柱子上移。 FTh/1"a
a.第一次需要移动1号盘,n为奇数时,1号盘首先移动到柱子B,为偶数时首先移动到柱子C。 /t04}+,e^
b.接下来如果移动的盘子不是1号盘。你有两个柱子可以选择。先找到1号盘所在的柱子,因为移动的盘子 l(3\ekU!
l8 XY
不能叠放到1号盘上,所以该盘可以移动的位置就是没有1号盘的那个柱子。 CTZ#QiNP
c.如果移动的盘子是1号盘。也有两个柱子可以选择。找到1号盘原先是从哪个柱子上移来的,因为移动的 to#T+d.(v
x8Nij:K#
顺序(顺时针或逆时针)一旦确定,就不会更改,所以排除from的那个柱子后,移动方向也就唯一了。