汉诺塔其实也就这么回事
初涉汉诺塔相关题目是在大一上学期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),复习一下,开始做题