Hanoi 塔
Problem Description
在柱子A上有 n 个 盘子,按从小到大的顺序从上到下排列,要将其移到柱子 C 上,可以借助 B 柱子,其中 B 柱子和 C 柱子都是空的。
要求:
- 每次只能移动一个盘子
- 每根柱子上的盘子都必须按照从小到大从上到下的顺序排列
分析
当A上面有N个盘子,如果我把N-1个盘子已经搬到了B上面,我只需要将A上的最后一个盘子放到C上面,第N个盘子的直径是最大的,再以后的搬动过程中是不需要动C上第N个盘子的。以上搬动N个盘子的问题,就变为搬N-1个盘子的问题,只是现在是 B 上面有( n - 1 )个盘子,而 A 上面没有盘子。不断继续下去,最后只有一个圆盘的时候,问题就解决了。
这种方式适合递归算法
有递归出口,那就是当盘子只有一个时候,移动到 C 上
使问题规模缩小,并是同一类问题
1. 将N-1个盘子从A 搬到B柱上面,(借助C)
2. 将A柱子上第N个盘子搬到C柱上面
3. 将B柱子上N-1个盘子搬到C柱子上面 (借助A)
代码
在这个代码中,“ hanoi(n-1,A,C,B) ” 和 “ hanoi(n-1,B,A,C) ”一个调换了 后两个的顺序,后一个调换了前两个的顺序(原来的顺序是 ( A,B,C)),输出的话,一直输出的是变量 A 到 C 的移动。
#include<bits/stdc++.h>
using namespace std;
void hanoi(int n,char A,char B,char C)
{
if(n==1)
{
printf("Move disk %d from %c to %c\n",1,A,C);
}
else
{
hanoi(n-1,A,C,B);
printf("Move disk %d from %c to %c\n",1,A,C);
hanoi(n-1,B,A,C);
}
}
int main()
{
int n;
while(cin>>n)
{
hanoi(n,'A','B','C');
}
return 0;
}