设为首页 加入收藏

TOP

用递归算法解决汉塔问题
2014-11-24 01:40:39 来源: 作者: 【 】 浏览:6
Tags:算法 解决 问题

汉塔有ABC三座塔,A塔座自下而上由大到小堆有圆盘,圆盘自上而下依次编号1,2,3,…,n-1,n。汉塔问题问如何将A塔的圆盘也按自下而上由大到小堆起来?并且在任何时候都不能允许大圆盘压小圆盘,而且顺序不能乱?既原样的将A塔的圆盘一个一个移向B塔。


解题思维;题中只给了三座塔,我们利用C塔将圆盘堆在B塔。首先将A塔的1号圆盘放在B塔,A塔德2号圆盘放在C塔,再把放在B塔德1号圆盘放在C塔,此时C塔拥有两个圆盘按要求自下而上从小到大排列。接下来将A塔的3号圆盘放在B塔,将C塔的1号圆盘放在B塔,把C塔德2号圆盘放在A塔,再把B塔的1号圆盘放在A塔,此时C塔空,1号2号按要求排在A塔,B塔只有3号圆盘。此时把B塔3号圆盘放在C塔,把A塔德1号放在B塔吗,把A塔德2号房在C塔,再把B塔德1号放在C塔,此时B塔空,C塔按要求排有123号圆盘。这次把A塔的4号圆盘放在B塔,这次就比较麻烦了先把C塔的1号放在A塔,C塔的2号房在B塔,再把A塔德1号放在B塔,把C塔德3号放在A塔,再把B塔的1号放在C塔,把B塔德2号放在A塔,再把C塔德1号放在A塔,此时C塔空,B塔只有4号圆盘,A塔按要求房有123到N号圆盘,缺4号圆盘。现在把B塔的4号圆盘房在C塔,现在推回去,把A塔德1号房在C塔,A塔的2号房在B塔,再把C塔的1号放在B塔,把A塔德3号房再C塔,此时刚好是3号压4号于C塔,再把,B塔的1号房在A塔,把C塔的2号放在C塔,把A塔的1号放在C塔,这下刚好推回来,此时B塔空,A塔最上面是5号圆盘,C塔按要求放有1234号圆盘。按这样的递推方法,将n-1个圆盘按要求放在C塔,第n个圆盘放在B塔,现在A塔空。n号圆盘是最大的圆盘,按问题要求我们终于把n号最大的圆盘放在了B塔,这下借助已空的A塔联合BC塔推回来,就可以把n个圆盘按要求放在B塔。
程序实现:
其实用程序的循环很简单实现。
void Hanoi (int n, char A, char B, char C)
{ if(n>0)
{Hanoi(n-1, A, C, B); /*把n-1号圆盘由A塔借助B塔移向C塔*
Move(n, A, B); /*n号圆盘由A塔移向B塔*/
Hanoi(n-1, C, B, A); /*n-1号圆盘由C塔借A塔移向B塔*/
}
}


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇北京创维信软件公司面试题 下一篇德邦java面试题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: