玩游戏写算法——汉诺塔

玩了个汉诺塔的flash游戏,总结下算法

四五层就不说了,太长,4层要15步,每步一截屏就刷死了,其实要想归纳出规律,最好还是玩四五层看看,多了才出规律。


上小下大,一个压一个,想把最底下的第n个盘子移到目的地C,必须把其余的n-1个移到中转柱B
那第n-1个盘子必须在中转柱B的最底下,也就是问题转换成把上边这n-1个盘子的“最底下”的(第n-1个)盘子移到目的柱B,
此时第n-1个盘子上边的n-2个盘子在C




以三层为例,八张图,七步,步骤如下:












游戏过程归纳成算法:步骤拆解,注意我说的第N-几个盘子是从上边数的,和此游戏标的数字相反

注意:每一个中转柱到下一层递归就成为了目的柱,就是传形参嘛,每堆从上边数的(n-i)个盘子都有不同的目的,为了方便,把字母A源、B中转、C目的还是代入了

单层结构示意

hanoi(N,A,B,C){

hanoi(上边N-1盘子个从源A到中转B;

第N个盘子直接源A到目的C;

hanoi(上边N-1个盘子从中转B到目的C;

}

伪代码函数原型(文字叙述的N个盘子从AC即为hanoi(N,A,B,C)

hanoi(N,A,B,C){

hanoiN-1,A,C,B;

第N个盘子直接源A到目的C;

hanoiN-1,B,A,C;

}

 


为了描述清晰,还是用文字展开过程吧

首次调用——参数N——hanoi(N,A,B,C);

hanoi(上边N-1盘子个从源A中转B;

第N个盘子直接源A到目的C;

hanoi(上边N-1个盘子从中转B目的C;

全层次完全展开:

hanoi(上边N-1盘子个从源A中转B;

第N个盘子直接源A到目的C;

hanoi(上边N-1个盘子从中转B目的C;

参数N-1——hanoi(N-1,A,B,C);

hanoi(上边N-2盘子个从源A中转B;

第N-1个盘子直接源A到目的C;

hanoi(上边N-2个盘子从中转B目的C;

全层次完全展开(新的一层,形参,中转B已变成目的B

hanoi(上边N-2盘子个从源A中转C),第N-1个盘子直接源A目的Bhanoi(上边N-2个盘子从中转C到目的B));

第N个盘子直接源A到目的C;

hanoi上边N-2个盘子从B中转A),第N-1个盘子直接从B目的Chanoi(上边N-2个盘子从中转A到目的C;



(左边一个递归展开,中间一个操作,右边一个递归展开,两边展开中间不动,挺像二叉树的操作)

.....

......

以此类推,参数为2

hanoi(上边1盘子个从源A中转B;

2个盘子直接源A到目的C;

hanoi(上边1个盘子从中转B目的C;

完全展开,已经展不开了,太大了

 

直到参数为1——hanoi(1,A,B,C);

这时候该结束了,if(N==1),直接AC(想想一层汉诺塔),其他的都不管了

 

 

所以hanoi函数为

void move(char getone,char putone)

{     cout<< getone <<"-->"<<putone<<endl; }

void hanoi(int n,char one,char two,char three)

{       void move(char getone,char putone);

        if (n==1) move (one,three);

        else

        {   hanoi (n-1,one,three,two);

            move(one,three);

            hanoi(n-1,two,one,three);

        }

}



程序运行结果:匹配,三层七步,四层十五步








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值