汉诺塔非递归算法.我只是将盘子的数量等于2,3的情况代到网上别人给的算法中验证了一下,没有错。并没有证明算法的正确性。算法是否有效,有待大家证明。 RtM.}wv;
kx(:Z8DX
include <iostream> Sf:lN4
#include <stdlib.h> sU!q~`; J
?6]ZQ\,
#ifdef _WIN32 |OT%,QT|
using namespace std; ;mxT>|z
#endif _[tBLGXD
_ILOA]ga#
static void hanoi(int height) SO<K#HfE$?
{ Lcb59Cs6e
int fromPole, toPole, Disk; XdVC>6
int *BitStr = new int[height], //用来计算移动的盘的号码 M_)T=s *
*Hold = new int[height]; //用来存贮当前的盘的位置。hold[0]为第一个盘所在的柱号 vt=S0X^$yc
char Place[] = {'A', 'C', 'B'}; e|9Bzli{
int i, j, temp; 3A1kH` X^q
Mxp4 YQl
for (i=0; i < height; i++) x G"p.
{ mW9b~G3k
BitStr = 0;
6)j4
TH
Hold = 1; ^Wz{su2
} 0].5[Jo
temp = 3 - (height % 2); //第一个盘的柱号 'Em($A(
int TotalMoves = (1 << height) - 1; UzwIV{
for (i=1; i <= TotalMoves; i++) )U`kU`+'
{ "n-xsAG
for (j=0 ; BitStr[j] != 0; j++) //计算要移动的盘 w2V E_
{ n_2LkW<?
BitStr[j] = 0; $&C%C\(>D
} @V u[Tg}J
BitStr[j] = 1; JPzPL\
Disk = j+1; x;aZ&
if (Disk == 1) 3Ab$
{ J>v>6OC6i
fromPole = Hold[0]; 1'B?f# s
toPole = 6 - fromPole - temp; //1+2+3等于6,所以6减去其它两个,剩下那个就是要移去的柱子 4"=pcHNV
temp = fromPole; //保存上一次从哪个柱子移动过来的 I2Q?7p
} Q{kuB+s
else |@|D''u>6
{ Wd<}|?R
fromPole = Hold[Disk-1]; 9V!K._Cb
toPole = 6 - Hold[0] - Hold[Disk-1]; ,%<77LE
} M#|xj <p
cout << "Move disk " << Disk << " from " << Place[fromPole-1] _<