汉诺塔与四塔问题
A:经典汉诺塔
题目描述:有N个圆盘和三座塔X,Y,Z,要将X上的所有圆盘移动到Y借助Z;要求一次移动一个,且小的圆盘不能在大的下面;
运用递归的方法可解决:读者做这一题之前,最好先去看一下递归算法哦;
程序代码如下:
#include<iostream.h>
enum tower {A='X',B='Y',C='Z'};
long k=0; //定义为全局变量k为移动的次数
void Move(int n,tower x,tower y)
{ k++;
//将第n个圆盘从塔座x移到塔座y的顶部
cout<<"The disk"<<" is moved from "
<<char(x)<<" to top of tower "<<char(y)<<endl;
}
void Hanoi(int n,tower x,tower y,tower z) //将塔座x上部的n个圆盘移到塔座y上,顺序不变
{
if(n){
Hanoi(n-1,x,z,y); //将 前n-1个圆盘从塔座x移到塔座z,塔座y为中介
Move(n,x,y); //将第n个圆盘从塔座x移到塔座y
Hanoi(n-1,z,y,x); //将塔座z上的n-1个圆盘移到塔座y上,塔座x为中介
}
}
int main()
{ long n;
while(cin>>n)
{ k=0;
Hanoi(n,A,B,C);
cout<<k<<endl;//假定n=3
}
}
B:汉诺塔的延伸-四塔问题 (经典中的经典,忘读者可以永远记住哦)
四塔的问题是汉诺塔的延伸,这样会加快移动的速度,较少移动的次数
这一题根据规律解题:
规律解析:
0: 0 //冒号左边的数为圆盘的数量
1: 0+2^0=1; //后一个等于前一个的值再加上
2: 1+2^1=3;
3: 3+2^1=5;
4: 5+2^2=9;
5: 9+2^2=13;
6: 13+2^2=17;
7: 17+2^3=25;
8: 25+2^3=33;
9: 33+2^3=41;
10: 41+2^3=49;
11: 49+2^4=65;
由此可以看出规律,后一个圆盘的移动次数=前一个圆盘的移动次数+2的K次幂方。写成函数为:
F【n】=F【n-1】*2^K;
故此我们可以写出代码:
#include<stdio.h>
unsigned long f[50005]={0,1};
void set()
{
unsigned long i=2,j,k=2,p=2;
while(1)
{
for(j=1;j<=p;j++)
{
f[i]=(f[i-1]+k)%10000;
i++;
if(i>50000) return ;
}
k=k*2;
k=k%10000;
p++;
}
}
int main()
{
set();
long n;
while(scanf("%ld",&n)!=EOF)
{
printf("%ld/n",f[n]);
}
return 0;
}
学完千万要记住哈! A ZA