Tower of Hanoi

汉诺塔其实也就这么回事

        初涉汉诺塔相关题目是在大一上学期C语言课递归章节,当时递归一知半解,汉诺塔一窍不通。经过了一年多的风霜洗礼,最近又见到汉诺塔的题,理解起来就容易多了。

        背景知识详参:http://zh.wikipedia.org/wiki/%E6%B1%89%E8%AF%BA%E5%A1%94

        把汉诺塔的移动过程通过递归抽象一下其实很简单,要把当前柱上的所有环移到目标柱上,就必然使最下的环先移到目标柱稳定下,那上面的怎么办呢?先移到中间柱就行了,所以汉诺塔的移动操作应该定义为这个形式hanoi(int n,plate from,plate via,plate to)四个参数分别代表起始柱上的环数、起始柱、中间柱、目标柱。先说递归边界,如果遇到起始柱上只有一个环,直接把这个环移到目标柱上。其余情况要先把上面n-1个环先经由目标柱移到中间柱上,再把起始柱上剩下的最大环移到目标柱上,最后把中间柱上的n-1个环经由起始柱移到目标柱上,这样递归就形成了。

code:

#include<stdio.h>
void hanoi(int n,char a,char b,char c)
{
    if(n==1)printf("move from %c to %c\n",a,c);
    else
    {
        hanoi(n-1,a,c,b);
        printf("move from %c to %c\n",a,c);
        hanoi(n-1,b,a,c);
    }
}
int main()
{
    int n,i;
    char a,b,c;
    while(scanf("%d",&n),n)hanoi(n,'A','B','C');
    return 0;
}
PS:这为的是codeforces上的一道题(392B),复习一下,开始做题 奋斗




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值