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
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),复习一下,开始做题




你可能感兴趣的:(语言/理论,递归)