问题:
有A,B,C三个柱子,A柱子上有n个圆盘(从上到下,圆盘大小逐渐变大),要把它移动到B柱子上。
条件:
- 每次移动,都必须保证小圆盘放在大圆盘上面
- 每次也只能移动一个圆盘
- 如果 n = 1 n=1 n=1的话,就可以直接把A柱上的一个圆盘移动到B柱上,就结束了
- 如果 n = 2 n=2 n=2的话,得先把上面一个移动到C柱上,然后再把A柱上剩下的一个移动到B柱上,最后再把C柱上的那一个移动到B柱上。
- 如果 n = 3 n=3 n=3的话,得先把上面 2 2 2个移动到C柱上,然后再把A柱上剩下的一个移动到B柱上,最后再把C柱上的那2个移动到B柱上。
- 如果 n = n n=n n=n的话,得先把上面 n − 1 n-1 n−1个移动到C柱上,然后再把A柱上剩下的一个移动到B柱上,最后再把C柱上的那 n − 1 n-1 n−1个移动到B柱上。
因为最底下一个圆盘比任何一个圆盘都要大,所以在移动它上面 n − 1 n-1 n−1个圆盘时就可以不用在考虑最后一个圆盘了(当它不存在)。
写具体实现的时候函数参数要有
- 要移动的圆盘个数 n n n
- 这 n n n个圆盘现在在哪个柱子上
- 想要移动到哪个柱子上
- 哪个柱子可以用来作为桥梁
#include<iostream>
void hanoi(int n, char A,char B,char C)//n,圆盘个数,A当前圆盘所在位置,B要移动到的位置,C空位置
{
if (n==1){
std::cout << A << "--->" << B << std::endl;
return;
}
hanoi(n - 1, A, C, B);//要想把n个圆盘移动到B柱,得先把上面n-1个圆盘移动到C柱上,为最底下一个圆盘腾出位置
hanoi(1, A, B, C); //然后把最底下的一个移动到B柱上
hanoi(n - 1, C, B, A);//最后再把刚才移动到C柱子的n-1个圆盘B柱上
return;
}
int main()
{
hanoi(3,'A','B','C');
}