博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P1096 Hanoi双塔问题
阅读量:4953 次
发布时间:2019-06-12

本文共 1257 字,大约阅读时间需要 4 分钟。

题目描述

给定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。

 

输入输出样例

输入样例#1: 
【输入样例1】1【输入样例2】2
输出样例#1: 
【输出样例1】2【输出样例2】6

说明

【限制】

对于50%的数据,1<=n<=25

对于100%的数据,1<=n<=200

【提示】

设法建立An与An-1的递推关系式。

思路:

先找出An的通项公式,而两个相同的圆盘移动方法和一个圆盘的移动方法差不多,只要最后再乘二就好了,先考虑每种大小一个圆盘

而显然An=2*An-1+1,就相当于先把上面n-1个圆盘先挪走,再挪最大的,再把n-1个挪到它上面

又因为A1=1,因此有An=2^n-1,最后再乘二,An=2^(n+1)-2

写的话用高精度,算出2^(n+1),注意到2的幂的个位数字是2,4,8,6,所有再减二的时候不用考虑退位

#include
#include
#include
#include
#include
#include
#include
using namespace std;int a[205];int n,len,newl;int main(){ scanf("%d",&n); a[1]=2;len=1; for(int j=1;j<=n;j++){ if(a[len]>=5) newl=len+1; else newl=len; for(int i=len;i>=1;i--){ a[i]=2*a[i]; if(a[i]>=10){ a[i+1]=a[i+1]+1; a[i]=a[i]-10; } } len=newl; } a[1]=a[1]-2; for(int i=len;i>=1;i--) printf("%d",a[i]); return 0;}

 

转载于:https://www.cnblogs.com/cangT-Tlan/p/8044788.html

你可能感兴趣的文章
打印等腰三角形
查看>>
《转》GDB中应该知道的几个调试方法
查看>>
罗马假日
查看>>
40个非常棒的Photoshop的海报制作教程
查看>>
ERROR 1366 (HY000): Incorrect string value: '\xE8\xB5\xB5\xE9\x9B\xB7' for column 'Sname' at row 1
查看>>
盒子自带属性
查看>>
jquery修改table某列的值
查看>>
在Position:absolute下居中设置
查看>>
python递归及斐波那契数列
查看>>
设计模式概述
查看>>
python random使用生成随机字符串
查看>>
[2017.02.24] 学习《正则表达式必知必会》
查看>>
两个已排序的整型数组,求交集,最快算法
查看>>
福建工程学院第十四届ACM程序设计大赛 - E - 外传:小晋逃生记
查看>>
【瞎搞】HDU 3257 Hello World!
查看>>
利用运行时给分类添加属性
查看>>
利用运行时,查看一个类的所有子类
查看>>
python Gunicorn
查看>>
maven package,clean,install,compile命令
查看>>
Python 排错UnicodeEncodeError 'ascii' codec can't encode character 错误解决方法
查看>>