汉诺塔问题是典型的递归问题
我们来看一下解题思路:
第一次移动,把A柱子上的前n-1个移动到B柱子上;
第二次移动,直接把A柱子上的最后一个移动到C柱子上;
第三次移动,把B柱子上的n-1个柱子借助柱子A移动到柱子C上。
首先要输出一个步数,我们其实可以研究一下这个步数的规律:
输入 输出
2 4
3 7
4 15
······ ······
n 2^n-1
懂了吧!
所以首先我们要输出(1<<n)-1,然后递归求解。
#include <bits/stdc++.h>
using namespace std;
void move(int a,int n,int c)//将a柱上的第n个移动到c柱
{
cout<<a<<" "<<c<<'\n';
}
void hanoi(int n,int a,int b,int c)//汉诺塔递归求解
{
if(n==1)move(a,1,c);// n==1直接求解
else
{
hanoi(n-1,a,c,b);//将a柱上的n-1个盘借助c柱移到b柱上
move(a,n,c);//将a柱上的第n个移动到c柱
hanoi(n-1,b,a,c); //将b柱上的n-1个盘借助a柱移到c柱上
}
}
int main()
{
int n;
cin>>n;
cout<<(1<<n)-1<<'\n';// 最短路径
hanoi(n,1,2,3);//递归n个汉诺塔
return 0;
}
看懂了吗?