💀🤭内卷起来🤭💀
😂也不知道xdm喜不喜欢二次元😂
介绍:
古代有一个梵塔,塔内有三个柱A、B、CA、B、C,AA柱上有6464个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这6464个盘子从AA柱移到BB柱,但每次只能允许移动一个盘子,并且在移动过程中,33个柱上的盘子始终保持大盘在下,小盘在上。在移动过程中可以借助CC柱。
思路:
假设现在A柱子上只有一个盘子,此时无需B柱子中转就可直接将盘子从A移动到C柱子上。
假设现在A柱子上有22个盘子,此时需将小盘子放到B柱子上,然后把大盘子放到C柱子上,最后将小盘子移动到C柱子上。(我们可以借助B将22个盘子移动到C柱子上,也可以借助C柱子将22个盘子从A移到B。)
假设A上面有33个盘子,可以根据移动22个盘子的过程,先借助C将A上的两个盘子移动到B,再将A上的大盘子移动到C,最后再讲B上的22个盘子移动到C…
以此类推,A柱子上有nn个盘子,可以将n-1n−1个盘子看作一个整体,即递归中的子问题。借助C柱子将A上的n-1n−1个盘子移动到B,再将A上的大盘子移动到C,然后借助A,将B上的n-2n−2和盘子移动到A上,将B上的大盘子移动到C上…如此往复。
由上所述,可定义一个递归函数 hanoi(n, A, B, C)
,边界条件为 n=1n=1,递归公式为 hanoi(n - 1, A, C, B)
,hanoi(n - 1, B, A, C)
。
假设:(每次只能移动与1个盘子)
只有一个盘子直接从a到c
只有两个盘子a到b,a到c,b到c
......
#include <iostream> using namespace std; void move(char src,char dest)//移动 { cout<<src<<"-->"<<dest<<endl; } void hanoi(int n, char src, char medium, char dest)//过程 { if(n==1) move(src,dest); else{ hanoi(n-1,src,dest,medium); move(src,dest); hanoi(n-1,medium,src,dest); } } int main(){ int m; cin>>m;//输入几个盘子 hanoi(m,'A','B','C'); return 0; }
小伙伴们试着运行查看一下结果