汉诺塔和四塔分析

   汉诺塔与四塔问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值