3个汉诺塔问题A—>C
移动次数2^n-1
- hannoni(int n,char a,char b,char c)把n个盘子借助b,从a移动到c
- move(int n,char a,char c)把第n个盘子,从a移动到c
#include<iostream>
#include<cmath>
using namespace std;
//汉诺塔问题A--->C
//2^n-1次移动次数 //把第n个盘子从a移动到c
void move(int n,char a,char c)
{cout <<"把"<<n<<"号盘子从"<<a<<"移到"<<c<<endl;
}
//把n个盘子a借助b移到c
void hannoni(int n,char a,char b,char c)
{if(n==1)//只需要移动一次 move(1,a,c);else{//a-->b n-1hannoni(n-1,a,c,b);move(n,a,c);//b--->c n-1hannoni(n-1,b,a,c);
}
}
int main()
{int n;cout <<"请输入要移动的盘子数"<<endl; cin>>n;hannoni(n,'A','B','C');return 0;
}
要点:A—>C
1.当n==1时直接从A移动到C
2.当n>1时,
先把n-1个盘子借助C,从A移动到B
再把第n个盘子从A移动到C
最后,借助A,把n-1个盘子从B移动到C
汉诺塔移动次数
要点:A—>C
1.当n==1时直接从A移动到C 移动一次
2.当n>1时,
先把n-1个盘子借助C,从A移动到B 移动n-1次
再把第n个盘子从A移动到C 移动一次
最后,借助A,把n-1个盘子从B移动到C 移动n-1次
所以,
n=1,T(N)=1
n>1,T(N)=2T(N-1)+1
代码示例
#include<iostream>
#include<cmath>
using namespace std;int count(int n){int number=0;if(n<=0)return -1;if(n==1)number=1;elsenumber=2*count(n-1)+1;return number;}int main()
{int n;cout <<"输入要移动的盘子个数"<<endl; cin>>n;cout<<count(n)<<endl;return 0;}