每日一道算法题

day03

题目:移动多少盘子才能完成汉诺塔游戏?

题目描述:

        汉诺塔问题是印度的一个古老传说,在一个庙里有三根金刚石棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不停地把它们一个个地从这另一根棒上,规定可用中间的一根棒作为辅助,但每次只能搬一个,而且大的不能放在小的上面,经过运算移动圆片的次数为1844 6744 0737 0955 1615,看来众僧们耗尽毕生精力也不可能完成金片的移动。

        后来这个传说就演变为汉诺塔游戏,游戏规则如下:

        (1)有3根柱子A,B,C,A柱子上有若干盘子。

        (2)每次移动一块盘子,小的只能叠在大的上面。

        (3)把所有盘子全部从A柱移到C柱上。

        (4)经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片.

        (5)如3阶汉诺塔的移动:A->C,A->B,C->B,A->C,B->A,B->CA->C。

   此外汉诺塔问题也是程序设计中的经典递归问题。

        解析:

        如果柱子标为ABC,要由A搬至C,在只有一个盘子时,就将它直接搬至C,当有两个盘子时,就将B作为辅助柱,如果盘子数超过两个,将第三个以下的盘子叠起来,就很简单了,每次处理两个盘子,也就是:A->B,A->C,B->C这三个步骤,而被遮住的部分,其实就是进入程式的递归处理,事实上,若有n个盘子,则移动完毕所需次数为2的n次方减去1,所以盘子数为64时,所需的次数为:2的64次方减去1=1844 6744 0737 0955 1615,假设每秒搬一个盘子的话,大约需要搬5850亿年,实现代码如下:

<script type="text/javascript">
    function hannuo(n,x,y,z){
        if(n==1){
            console.log('移动盘1从'+x+'到'+z)
        }else{
            hannuo(n-1,x,z,y)
            console.log('移动盘'+n+'从'+x+'到'+z)
            hannuo(n-1,y,x,z)
        }
    }
</script>

假设有4个盘子,3根柱子,运行结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值