社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 社区论坛任务 迷你宠物
  • 4424阅读
  • 0回复

汉诺塔非递归算法

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
汉诺塔非递归算法.我只是将盘子的数量等于2,3的情况代到网上别人给的算法中验证了一下,没有错。并没有证明算法的正确性。算法是否有效,有待大家证明。 -y|']I^ &  
x{zZ%_F  
include <iostream> p~=z)7% e'  
#include <stdlib.h> jF j'6LT9/  
@ <2y+_e  
#ifdef _WIN32  U#K4)(C  
using namespace std; 2p#d  
#endif S9 $t9o  
89GW!  
static void hanoi(int height) VS ;y  
{ (Fuu V{x|  
  int fromPole, toPole, Disk; k\;D;e{  
  int *BitStr = new int[height],   //用来计算移动的盘的号码 *{j;LA.BR#  
    *Hold   = new int[height];   //用来存贮当前的盘的位置。hold[0]为第一个盘所在的柱号 Mp!1xx  
  char Place[] = {'A', 'C', 'B'}; rw3tU0j  
  int i, j, temp; -3~S{)  
Ta/zDc"e  
  for (i=0; i < height; i++)               , %8)I("  
  { rP2h9Cb  
    BitStr = 0; kONn7Itbu  
    Hold = 1; \v\ONp"  
  } T,uF^%$@AQ  
  temp = 3 - (height % 2);               //第一个盘的柱号 5pDE!6gQ  
  int TotalMoves = (1 << height) - 1; LVm']_K(f  
  for (i=1; i <= TotalMoves; i++) AB,(%JT/2{  
  { "DGap*=J  
    for (j=0 ; BitStr[j] != 0; j++)         //计算要移动的盘 ^c(r4#}$"  
    { "eOl(TSu/  
        BitStr[j] = 0; 'nh2}  
    } :@P6ibcX  
    BitStr[j] = 1; iHf):J?8 y  
    Disk = j+1; (jhi<eV  
    if (Disk == 1) 0-{E% k  
    { IBeorDIZ  
        fromPole = Hold[0]; x7^VU5w#  
        toPole = 6 - fromPole - temp; //1+2+3等于6,所以6减去其它两个,剩下那个就是要移去的柱子 l<4P">M!.  
        temp = fromPole;     //保存上一次从哪个柱子移动过来的 O43"-  
    } .>[l@x"  
    else Vj1V;dHv  
    { sq(5k+y*J  
        fromPole = Hold[Disk-1]; cT@| $A  
        toPole = 6 - Hold[0] - Hold[Disk-1]; 5{+2#-  
    }     "q=ss:(  
    cout << "Move disk " << Disk << " from " << Place[fromPole-1] .=<s@Sg,t  
        << " to " << Place[toPole-1] << endl; GYb&'#F~t  
    Hold[Disk-1] = toPole; YU+P+m2X  
  } vL[IVBG^  
} W.cc!8  
i%<NKE;v7m  
;/wH/!b  
lc~c=17  
m;rr7{7X  
int main(int argc, char *argv[]) ;8K> ]T)  
{ OvwoU=u  
  cout << "Towers of Hanoi: " << endl +$VDV4l  
      << "moving a tower of n disks from pole A to pole B by using pole C" << endl; dyf>T}Iy  
  cout << "Input the height of the original tower: "; +]-'{%-zK  
  int height; 3]lq#p:  
  cin >> height; f_LXp$n  
  hanoi(height); 0m.`$nlV-  
2_3os P\Z  
  system("PAUSE"); d/Wp>A@dob  
  return EXIT_SUCCESS; "x$L 2>9  
} Wtk|}>Pf  
2^Im~p~ByE  
3kUb cm  
qLxcr/fK  
问题描述:有三个柱子A, B, C. A柱子上叠放有n个盘子,每个盘子都比它下面的盘子要小一点,可以从上 U&Atgv  
-}sMOy`  
到下用1, 2, ..., n编号。要求借助柱子C,把柱子A上的所有的盘子移动到柱子B上。移动条件为:1、一 xZ%3e sp  
<3N\OV2  
次只能移一个盘子;2、移动过程中大盘子不能放在小盘子上,只能小盘子放在大盘子上。 ZBx,'ph}4  
1R*;U8?  
算法要点有二: Ei+lVLoC  
1、确定哪一个盘子要移动。有n个盘子的Hanoi塔需要移动2^n -1次,设m为n位的二进制数,则m的取值范 Lk$Mfm5"M  
vRW;{,d  
围为0~2^n -1。让m每次递增1,可以发现,m中最低一位的刚刚由0变为1的位置的位置编号,和即将要移 3*j1v:x`  
VSCKWYy  
动的盘子编号有确定关系。 e]; IQ|  
62.Cq!~  
2、这个盘子往哪个柱子上移。 ~l] w=[ z  
a.第一次需要移动1号盘,n为奇数时,1号盘首先移动到柱子B,为偶数时首先移动到柱子C。 [okV[7  
b.接下来如果移动的盘子不是1号盘。你有两个柱子可以选择。先找到1号盘所在的柱子,因为移动的盘子 bf1$:09  
?z-nY,'^uq  
不能叠放到1号盘上,所以该盘可以移动的位置就是没有1号盘的那个柱子。 sh`3${  
c.如果移动的盘子是1号盘。也有两个柱子可以选择。找到1号盘原先是从哪个柱子上移来的,因为移动的 x5smJ__/  
hSAI G  
顺序(顺时针或逆时针)一旦确定,就不会更改,所以排除from的那个柱子后,移动方向也就唯一了。
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

您目前还是游客,请 登录注册
批量上传需要先选择文件,再选择上传
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八