汉诺塔非递归算法.我只是将盘子的数量等于2,3的情况代到网上别人给的算法中验证了一下,没有错。并没有证明算法的正确性。算法是否有效,有待大家证明。 +r$.v|6
YgiGI
<U
include <iostream> z{g<y^Im+E
#include <stdlib.h> I7PWOd
5tU"|10m3
#ifdef _WIN32 5)zB/Ta<
using namespace std; nTU~M~gky
#endif ?03Zy3/
iy82QNe
static void hanoi(int height) BNCJT$tYX
{ sOxdq"E
int fromPole, toPole, Disk; t60/f&A#7H
int *BitStr = new int[height], //用来计算移动的盘的号码 .:ZXtU
*Hold = new int[height]; //用来存贮当前的盘的位置。hold[0]为第一个盘所在的柱号 &iOtw0E
char Place[] = {'A', 'C', 'B'}; Hm*vKFhz
int i, j, temp; L||yQH7n
|2<f<k/UT
for (i=0; i < height; i++) $cOD6Xr)d
{ 1:!rw,Jzl`
BitStr = 0; W-PZE|<
Hold = 1; -NPkN%h
} (bt]GAxb1
temp = 3 - (height % 2); //第一个盘的柱号 ];d:z[\P
int TotalMoves = (1 << height) - 1; $JB:rozE
for (i=1; i <= TotalMoves; i++) gyQ9Z}
{ =(X'c.%i
for (j=0 ; BitStr[j] != 0; j++) //计算要移动的盘 7=.VqC^
{ Z{
Zox[/
BitStr[j] = 0; G^ZkY
} +@uC:3jM
BitStr[j] = 1; ^Ai_/! "
Disk = j+1; .r| vz6tU?
if (Disk == 1) p\_qHq\;j
{ GLQvAHC
fromPole = Hold[0]; '%!M>rY,
toPole = 6 - fromPole - temp; //1+2+3等于6,所以6减去其它两个,剩下那个就是要移去的柱子 =Xjuz:9D~
temp = fromPole; //保存上一次从哪个柱子移动过来的 r)5\3j[P
} '(pdk
else d+2O^of:T
{ J8v:a`bX&
fromPole = Hold[Disk-1]; 7oe@bS/Z
toPole = 6 - Hold[0] - Hold[Disk-1]; M y"!j,Up
} .(1j!B4^
cout << "Move disk " << Disk << " from " << Place[fromPole-1] 0^&R7Rv c
<< " to " << Place[toPole-1] << endl; xnQGCw?S&}
Hold[Disk-1] = toPole; @
KPv&UB
} e~s7ggg2k
} '+I
2$xE
[9U srpYi
@*"<U]
DYKV54\ue
v~2XGm
int main(int argc, char *argv[]) q AVfbcb
{ O?,i?
cout << "Towers of Hanoi: " << endl ) .-(-6=R
<< "moving a tower of n disks from pole A to pole B by using pole C" << endl; Bb[0\Hs7
cout << "Input the height of the original tower: "; 4Eh BpTg
int height; :$cSQ(q9a
cin >> height; a H|OA\<
hanoi(height); K@sP~('
KvJP(!{
system("PAUSE"); )]b@eGNGj
return EXIT_SUCCESS; K# i*9sM
} NVA`t]gn
):fu
y5Wqu9C\Io
0"<;You
问题描述:有三个柱子A, B, C. A柱子上叠放有n个盘子,每个盘子都比它下面的盘子要小一点,可以从上 %c&Ah
)|h;J4V
到下用1, 2, ..., n编号。要求借助柱子C,把柱子A上的所有的盘子移动到柱子B上。移动条件为:1、一 aH PSnB&
"p~]m~g
次只能移一个盘子;2、移动过程中大盘子不能放在小盘子上,只能小盘子放在大盘子上。 d! QD vO
BQuliX&
算法要点有二: zj$_iB`9
1、确定哪一个盘子要移动。有n个盘子的Hanoi塔需要移动2^n -1次,设m为n位的二进制数,则m的取值范 [OoH5dD
VVQ74b
围为0~2^n -1。让m每次递增1,可以发现,m中最低一位的刚刚由0变为1的位置的位置编号,和即将要移 Y\g90
rI^~9Rz
动的盘子编号有确定关系。 aC8,Y$>?E`
N]s7/s
2、这个盘子往哪个柱子上移。 vzyI::f?
a.第一次需要移动1号盘,n为奇数时,1号盘首先移动到柱子B,为偶数时首先移动到柱子C。 >H1|c%w
b.接下来如果移动的盘子不是1号盘。你有两个柱子可以选择。先找到1号盘所在的柱子,因为移动的盘子 enbN0
7z&adkG:
不能叠放到1号盘上,所以该盘可以移动的位置就是没有1号盘的那个柱子。 'q};L 6
c.如果移动的盘子是1号盘。也有两个柱子可以选择。找到1号盘原先是从哪个柱子上移来的,因为移动的 F%_,]^ n[
3n84YX{
顺序(顺时针或逆时针)一旦确定,就不会更改,所以排除from的那个柱子后,移动方向也就唯一了。