汉诺塔问题的的c++实现


在一根柱子上从下往上按照大小顺序摞着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;
}


  • 9
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值