问题:
汉诺塔传说: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片圆盘。大梵天命令婆罗门把圆盘从下面开始按照带线啊哦顺序重新拜访在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
递归思想:递归就是自己调用自己,每次调用时传入不同的变量。直至逼近条件。
汉诺塔思想:首先:设三根柱子 A B C
1、当A上只有一片圆盘时,直接将圆盘从A上移到C上。
2、当A有两片时,上面较小的先移到B(A-B),较大的移到C(A-C),之后较小 的从B移到 C(B-C);
3、当A上有三片时,同样先要把最后一片较大的移到C,剩下的看作一个整体,依据上面方法,将2片移到B。(需要借助C盘),之后通过借助A盘,将B盘上2片移到C上。
即:若有n片,先移动最后一片至C盘(需要借助B),剩下的n-1片看作一个整体,借助C盘移动到B盘,之后借助A盘将B盘上圆盘移动到C盘。继续递归,直至剩1片直接移到C盘上。
总结:由盘向目标盘移动时,需要借助第三个盘进行移动(因为要遵守,每次只移动一盘,且小圆片总在大圆片上。)
示例代码:
#include<bits/stdc++.h>
using namespace std;
void hanoi(int n,char a,char b,char c){
if(n==1)
printf("%c-%c\n",a,c);
else {
hanoi(n-1,a,c,b);
printf("%c-%c\n",a,c);
hanoi(n-1,b,a,c);
}
}
int main(){
hanoi(3,'A','B','C');
return 0;
}
说明:每次只移动一片,此为移动的过程。