汉诺塔非递归算法.我只是将盘子的数量等于2,3的情况代到网上别人给的算法中验证了一下,没有错。并没有证明算法的正确性。算法是否有效,有待大家证明。 /Hl]$sJY
wA<#E6^vG
include <iostream> kiFTx
&gf
#include <stdlib.h> 0UvN ws
Iz\IQa
#ifdef _WIN32 85 tQHm6j
using namespace std; 4#m"t?6!
#endif jz2W/EE`w
@OlV6M;qJ
static void hanoi(int height) 2*K _RMr~
{ EV 8}C=
int fromPole, toPole, Disk; V{[vIt*
int *BitStr = new int[height], //用来计算移动的盘的号码 L.z`>1
*Hold = new int[height]; //用来存贮当前的盘的位置。hold[0]为第一个盘所在的柱号 ?qt>;o|Ue
char Place[] = {'A', 'C', 'B'}; jnuovM!x~
int i, j, temp; czf|c
Svo gvn
for (i=0; i < height; i++) Q1Sf7)
{ zl j%v/9
BitStr = 0; wV;qc3
Hold = 1; Y|=/*?o}
} H}QOoXWkg
temp = 3 - (height % 2); //第一个盘的柱号 S&@uY#_(*T
int TotalMoves = (1 << height) - 1; KS/1ux4x
for (i=1; i <= TotalMoves; i++) dkC[Jt
{ ~',<7eW
for (j=0 ; BitStr[j] != 0; j++) //计算要移动的盘 bb6J$NR
{ (:>:tcE
BitStr[j] = 0; 1wl8
} Cu0N/hBT
BitStr[j] = 1;
ajayj|h
Disk = j+1; .4"9o%
if (Disk == 1) v(\kSlJ
{ 6t|FuTC
fromPole = Hold[0]; z Uqt^_
toPole = 6 - fromPole - temp; //1+2+3等于6,所以6减去其它两个,剩下那个就是要移去的柱子 V11Zl{uOl
temp = fromPole; //保存上一次从哪个柱子移动过来的 sW B;?7P
} Brh<6Btl
else f#a ~av9rC
{ eGS1% [
fromPole = Hold[Disk-1]; |:s4#3
toPole = 6 - Hold[0] - Hold[Disk-1]; 37 wm[Z
} MmBM\Dnv
cout << "Move disk " << Disk << " from " << Place[fromPole-1] t>h<XPJi
<< " to " << Place[toPole-1] << endl; 95,y@~*]
Hold[Disk-1] = toPole; \5$N>
2kO
} e}? #vTRI}
} I#D{6%~
8 Vj]whE
*BYSfcX6
EAcJ>
x )wIGo
int main(int argc, char *argv[]) vIrLG1EK
{ 'Lft\.C
cout << "Towers of Hanoi: " << endl AfG!(AF`
<< "moving a tower of n disks from pole A to pole B by using pole C" << endl; rHu #
cout << "Input the height of the original tower: "; iq
'3.-xYr
int height; `5;O|qRq
cin >> height; #_}lF<k
hanoi(height); #~54t0|Cd>
N0h"EV[
system("PAUSE"); Z<Rz}8s
return EXIT_SUCCESS; lM C4j
} 2+Z2`k]AC
BlS0I%SN
m&DDz+g
MPMJkL$F^
问题描述:有三个柱子A, B, C. A柱子上叠放有n个盘子,每个盘子都比它下面的盘子要小一点,可以从上 &%`IPhbT
9)Y]05us
到下用1, 2, ..., n编号。要求借助柱子C,把柱子A上的所有的盘子移动到柱子B上。移动条件为:1、一 h3D8eR.
#F.;N<a
次只能移一个盘子;2、移动过程中大盘子不能放在小盘子上,只能小盘子放在大盘子上。 dZm>LVjG
W$@q
~/E
算法要点有二: e@s+]a8D-k
1、确定哪一个盘子要移动。有n个盘子的Hanoi塔需要移动2^n -1次,设m为n位的二进制数,则m的取值范 W?!(/`J]
VY$hg
围为0~2^n -1。让m每次递增1,可以发现,m中最低一位的刚刚由0变为1的位置的位置编号,和即将要移 KUVsCmiT
'|<