汉诺塔非递归算法.我只是将盘子的数量等于2,3的情况代到网上别人给的算法中验证了一下,没有错。并没有证明算法的正确性。算法是否有效,有待大家证明。 U-0#0} _
,jy*1Hjd
include <iostream> ;r=b|B9c
#include <stdlib.h> b'ml=a#i0
V 'X;jC
#ifdef _WIN32 f>$h@/-*
using namespace std; &~B5.sppnB
#endif 5)zn :$cz
(1pEEq84
static void hanoi(int height) PiLJZBUv
{ 5/m$)wE
int fromPole, toPole, Disk; <-UOISyf
int *BitStr = new int[height], //用来计算移动的盘的号码 J
NC
*Hold = new int[height]; //用来存贮当前的盘的位置。hold[0]为第一个盘所在的柱号 n,P5o_^:
char Place[] = {'A', 'C', 'B'}; iy\KzoB
int i, j, temp; :9l51oE7
\g-j9|0
for (i=0; i < height; i++) ,`td@Y
{ LF*Q!
BitStr = 0; Oajv^H,Em
Hold = 1; %Hi~aRz
} BbJkdt7
temp = 3 - (height % 2); //第一个盘的柱号 v|
z08\a[
int TotalMoves = (1 << height) - 1; %K 4
for (i=1; i <= TotalMoves; i++) 2
Tvvq(?T
{ h5|.Et
for (j=0 ; BitStr[j] != 0; j++) //计算要移动的盘 2aNT#J"_
{ TrE3S'EU#R
BitStr[j] = 0; tn/T6C^)
} <XQ.A3SG!
BitStr[j] = 1; HTz+K6&
Disk = j+1; mnF}S5[9
if (Disk == 1) P\~{3U
{ ]*%+H|l
fromPole = Hold[0]; Cd#E"dY6
toPole = 6 - fromPole - temp; //1+2+3等于6,所以6减去其它两个,剩下那个就是要移去的柱子 q]4pEip
temp = fromPole; //保存上一次从哪个柱子移动过来的 K2'O]#
} K.>wQA&
else -ewQp9)G
{ V7=SV:+1or
fromPole = Hold[Disk-1]; Q^eJ4{Ya:
toPole = 6 - Hold[0] - Hold[Disk-1]; oB c@]T5>
} |bZM/U=
cout << "Move disk " << Disk << " from " << Place[fromPole-1] m.%`4L^`T
<< " to " << Place[toPole-1] << endl; TbE:||r?^
Hold[Disk-1] = toPole; lx,`hl%
} ySdN;d:q
} #Gv{UU$]
fW0$s`
wpPn}[a
83]PA<R
'bW5Fr>W
int main(int argc, char *argv[]) ]]iO- }
{ qFRdg V>8
cout << "Towers of Hanoi: " << endl 96|[}:+$&:
<< "moving a tower of n disks from pole A to pole B by using pole C" << endl; y@vj;3:
cout << "Input the height of the original tower: "; 2%rLoL$Y2+
int height; j033%p+Xc
cin >> height; B(HT.%r^A
hanoi(height); <"&'>?8j
BQgoVnQo_c
system("PAUSE"); oJ;rc{n-
return EXIT_SUCCESS; 0.(<'!"y
} Z/ bB
h
x%BF{Sw
T|'&K:[TJ
l\q}
|o
问题描述:有三个柱子A, B, C. A柱子上叠放有n个盘子,每个盘子都比它下面的盘子要小一点,可以从上 (wt+`_6
k{Lv37H
到下用1, 2, ..., n编号。要求借助柱子C,把柱子A上的所有的盘子移动到柱子B上。移动条件为:1、一 Wr|G:(kw\!
HD # r0)
次只能移一个盘子;2、移动过程中大盘子不能放在小盘子上,只能小盘子放在大盘子上。 y62%26 [
KS>$`ax,
算法要点有二: 18!VO4u\I
1、确定哪一个盘子要移动。有n个盘子的Hanoi塔需要移动2^n -1次,设m为n位的二进制数,则m的取值范 |w)5;uQ&\
2wh#$zGy
围为0~2^n -1。让m每次递增1,可以发现,m中最低一位的刚刚由0变为1的位置的位置编号,和即将要移 X:q_c =X
o$_93<zc
动的盘子编号有确定关系。 cqL(^R.
E'dX)J9e$/
2、这个盘子往哪个柱子上移。 6* rcR]
a.第一次需要移动1号盘,n为奇数时,1号盘首先移动到柱子B,为偶数时首先移动到柱子C。 `ti8-
b.接下来如果移动的盘子不是1号盘。你有两个柱子可以选择。先找到1号盘所在的柱子,因为移动的盘子 delf
]
r4knN
2:
不能叠放到1号盘上,所以该盘可以移动的位置就是没有1号盘的那个柱子。 f{Q p
c.如果移动的盘子是1号盘。也有两个柱子可以选择。找到1号盘原先是从哪个柱子上移来的,因为移动的 p!"(s/=
9R]](g#
顺序(顺时针或逆时针)一旦确定,就不会更改,所以排除from的那个柱子后,移动方向也就唯一了。