数据结构作业3-4(周)问题A:Hanoi双塔问题

题目描述

给定A,B,C三根足够长的细柱,在A柱上放有2n个中间有空的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形)。现要将 这些国盘移到C柱上,在移动过程中可放在B柱上暂存。

在这里插入图片描述
但我发现上面这个图给的不对,我更改一下
在这里插入图片描述
要求:
(1)每次只能移动一个圆盘;

(2) A、B、C三根细柱上的圆盘都要保持上小下大的顺序;

任务:

设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。

输入

输入文件hanoi.in为一个正整数n,表示在A柱上放有2n个圆盘。

输出

输出文件hanoi.out仅一行,包含一个正整数,为完成上述任务所需的最少移动次数An。

我的Tips:

将我冥思苦想的想法写到了代码注释里,以前我要被单个汉诺塔的递归想法弄得心痛,但是想明白之后其实就是把大象装进冰箱里分几步,第一步开门,第二步把大象塞进去,第三步关上冰箱门一样的想法。这问题也是第一步把最上面的2n-2个圆盘放在中间柱上,第二步把剩下的最下面两个放在最右边的柱子上,第三步把那中间柱上的所有圆盘放在最右边的柱子上,再细了分怎么解决(2n-4)个,(2n-6)个,直到第一次就挪两个,递归想法就完成了。还有我是真小白,智商较低,关于计算机的课都是及格边缘,经常遭同学们碾压,没有大佬愿意带我只能自救,但我在这里仍希望同样遇到本问题的你能够通过本题。

#include<iostream>
#include<cstring> 
using namespace std;
/*
 本题的思路和单个汉诺塔一样,第一个移动两次,第二个是移动六次,第n个可得到函数F(n)=2F(n-1)+2
 本题还要进行高精度算法的实现 ,到n=200时都已经快百位的数字了,不这么弄OJ系统直接提示答案错误25%。
 代码中的代码注释会更好的帮助你理解 
*/ 
int main()
{   int i,n,temp,a[100];       //数组a是用来保留高精度算法中的各个位的数字,仅限在n<=200内成功,要是大于的话自己看着办吧 
    memset(a,0,sizeof(a));     //第一步使数组a中所有数据为0,不这么弄各种诡异的结果就会出现 ,还有写上这个必须加上#include<cstring>,否则报错 。   
    cin>>n; a[0]=2;   
    int len=1;                  //len的意思是会存在几位 ,比如n=3时答案是14,那么len=2 
    n--;    
    while(n--)    
    {   //cout<<n<<" ";
        temp=0;            
        for(i=0;i<len;i++)      //高精度算法,temp在进位时运用    
  	{   a[i]=a[i]*2+temp;            
   	    if(i==0) a[i]+=2;   //根据公式,每一遍循环中个位都要加2        
            temp=a[i]/10;       //进位的话temp就变为1,不进位就仍为0
                                //比如n=3->n=4时14的个位4先乘2后加2,得到a[0]=10,那么temp=1到十位上时a[1]=1*2+1=3 ,得到30  
            a[i]%=10;           //取余 
          //cout<<i<<":"<<a[i]<<" " ;    
     	}
  	  //cout<<temp<<" "  ;      
    	a[len]+=temp;        
    	if(a[len])len++;
  	//cout<<"len:"<<len<<endl;  
     }    
     for(int i=len-1;i>=0;i--){ cout<<a[i]; }          
     return 0;
}
//明日方舟黄铁行动还没打,害。 没有银灰的真男人斩真的是太难了。

运行结果的话我们直接取n=200
在这里插入图片描述

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值