在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘,求把圆盘从下面开始按大小顺序重新摆放在另一根柱子上需要移动多少次。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
解答:
我们可以拿n=3的时候举例子:
易知f(1)=1,f(2)=3,f(3)=7……;
当n=2时候(1,2,3分别表示小中大三块盘子):
当n=3时候:
n=3的前三步就是重复n=2时候,把小的两块移动到另一个一个柱子。
然后就是将3移动到另一块柱子上,在继续重复n=2把小的两块移动到另一个(指存在3的一个)柱子上。
扩展到n,即f(n)=2*f(n-1)+1
这就变成了递归问题!!
只计算次数,简单的c++程序如下:
#include <iostream>
using namespace std;
int main()
{
int num,cont=0,a=1;
cout<<"请输入需要移动的盘子数目:"<<endl;
cin>>num;
int val(int); //函数声明
if(num==0){
cout<<"输入的数字必须大于0!"<<endl;
return -1;
}
else
cout<<"需要"<<val(num)<<"次"<<endl;
return 0;
}
int val(int n){
int c;
if(n==1) c=1;
else c=2*val(n-1)+1;
}
显示步骤:
每个步骤都是 将n-1个盘子从A移到B,把最下面个移到C,然后把N-2个从B移到A,第N-1个移到C,如此继续下去。
#include<iostream>
using namespace std;
int main()
{
void hanoi(int n,char one,char two,char three);
int m;
cout<<"输入盘子数:";
cin>>m;;
hanoi(m,'A','B','C');
}
void hanoi(int n,char one,char two,char three)
{
void move(char x,char y);
if (n == 1)
{
move(one,three);
}
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
void move(char x, char y)
{
cout<<x<<"-->"<<y<<endl;
}