汉诺塔问题
#include<cstdio>
#include<iostream>
using namespace std;
int h(int n,char a,char b,char c)
{
if(n==1)//边界情况
{
cout<<a<<"-"<<c<<endl;//只用移一次
return 0;
}
else
{
h(n-1,a,c,b);//移到中转
cout<<a<<"-"<<c<<endl;
h(n-1,b,a,c);//最大的移到目标
}
}
int main()
{
int n;
cin>>n;
h(n,'A','B','C');
return 0;
}
所需的步数
#include<cstdio>
#include<iostream>
using namespace std;
int f(int n)
{
if(n==1) return 1;
else
{
return 2*f(n-1)+1;
}
}
int main()
{
int n;
cin>>n;
cout<<f(n);
return 0;
}
/*f(3)=
将上面两个从A移向B,为f(2)步;
将最下面的大的从A移向C;
将B的两个移向C,为f(2)步。
即f(3)的步数为
2*f(2)+1.
f(n)=2*f(n-1)+1; */