3145 汉诺塔游戏

题目描述 Description

汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题。在A,B,C三根柱子上,有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我A上(如图所示),你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔。

游戏中的每一步规则如下:

1. 每一步只允许移动一个盘子(从一根柱子最上方到另一个柱子的最上方)

2. 移动的过程中,你必须保证大的盘子不能在小的盘子上方(小的可以放在大的上面,最大盘子下面不能有任何其他大小的盘子)

如对于n=3的情况,一个合法的移动序列式:

1 from A to C

2 from A to B

1 from C to B

3 from A to C

1 from B to A

2 from B to C

1 from A to C

给出一个数n,求出最少步数的移动序列

输入描述 Input Description

一个整数n

输出描述 Output Description

第一行一个整数k,代表是最少的移动步数。

接下来k行,每行一句话,N from X to Y,表示把N号盘从X柱移动到Y柱。X,Y属于{A,B,C}

样例输入 Sample Input

3

样例输出 Sample Output

7

1 from A to C

2 from A to B

1 from C to B

3 from A to C

1 from B to A

2 from B to C

1 from A to C

数据范围及提示 Data Size & Hint

n<=10

分类标签 Tags 点此展开

代码如下:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
void mov(int n,char A,char B,char C)
{
if(n==0)return;//没有要移动的,结束;
if(n==1)
{
cout<<1<<" from "<<A<<" to "<<C<<endl;return;//当只移动1个时
}
mov(n-1,A,C,B);//将n-1个从a经过c移动到b;
cout<<n<<" from "<<A<<" to "<<C<<endl;//输出从a移动到c;
mov(n-1,B,A,C); //再从b经过a移动到c;
}
int main()
{
int n;
scanf("%d",&n);
cout<<pow(2,n)-1<<endl;//输出步骤数;
mov(n,'A','B','C');//从A移到C经过B;
return 0;
}

递归问题 :当数据很大时,怎么算都算不完,所以解决一个大问题时,我们从小问题入手;

设步骤数为sum;

n=0,sum=0;

n=1,sum=1;

n=2,sum=3;

n=3,sum=7;

发现 sum=pow(2,n)-1;

也可以发现 当把n件物品从a--c时,一定要先将n-1件先取出,通过c先移到b,再将a中剩下的最后一件移到c上;

可以说是每次都将最大的取出;

所以过程是:先将n-1个取出放到b,再取最大的放到c底部,再将b的n-1个放到c;

所以 f(n)=f(n-1)*2+1; (将n-1拿出来放回去一共两边,将最大放回去是1边)

3145 code[VS]汉诺塔游戏--递归的更多相关文章

  1. CODEVS 3145 汉诺塔游戏 递归

    题目描述 Description 汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题.在A,B,C三根柱子上,有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我A上(如图所示),你的 ...

  2. Hanio汉诺塔代码递归实现

    1.背景介绍 Hanio (汉诺塔,又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...

  3. what' the python之递归函数、二分算法与汉诺塔游戏

    what's the 递归? 递归函数的定义:在函数里可以再调用函数,如果这个调用的函数是函数本身,那么就形成了一个递归函数. 递归的最大深度为997,这个是程序强制定义的,997完全可以满足一般情况 ...

  4. codevs3145 汉诺塔游戏

    3145 汉诺塔游戏  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 白银 Silver     题目描述 Description 汉诺塔问题(又称为河内塔问题),是一个大家熟知 ...

  5. 从"汉诺塔"经典递归到JS递归函数

    前言 参考<JavaScript语言精粹> 递归是一种强大的编程技术,他把一个问题分解为一组相似的子问题,每一问题都用一个寻常解去解决.递归函数就是会直接或者间接调用自身的一种函数,一般来 ...

  6. 从汉诺塔游戏理解python递归函数

    汉诺塔游戏规则: 有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方 图 ...

  7. Pyhton:汉诺塔游戏

    #汉诺塔游戏攻略! def hanoi(n,x,y,z): if n == 1: print(x,'-->',z) else: hanoi(n-1,x,z,y) #将前n-1个盘子从x移动到y上 ...

  8. 用C语言实现汉诺塔自动递归演示程序

    用C语言实现汉诺塔自动递归演示程序 程序实现效果 1.变界面大小依照输入递归数改变. 2.汉诺塔自动移动演示. 3.采用gotoxy实现流畅刷新. 4.保留文字显示递归流程 程序展示及实现 githu ...

  9. HDU 2064 汉诺塔III(递归)

    题目链接 Problem Description 约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由64个圆盘构成的塔.目的是将最左边杆上的盘 ...

随机推荐

  1. 基于Promise对象的新一代Ajax API--fetch

    ***************************************************************** #fetch Request 使用isomorphic-fetch发 ...

  2. Linux下Mysql 操作命令

    Linux下Mysql 操作命令 一.连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlb ...

  3. ASP.NET MVC Select无限级分类选择下拉框

    1:读取父级下的所有子类别 *ViewBag.ParentItemList:不能与ParentId相同 private void ParentDropDownList() { List<SAS. ...

  4. 深入理解PHP之:Nginx 与 FPM 的工作机制

    网络上有很多关于如何配置 Nginx + FPM 的文章,但它们更多从操作的角度出发,告诉我们怎么做,但却没有告诉我们为什么要这么做,本文从 Nginx 与 FPM 的工作机制出发,探讨配置背后的原理 ...

  5. 开源CMDB详细安装使用

    CMDB的GitHub地址: https://github.com/open-cmdb/cmdb 环境说明 [root@WCY ~]# cat /etc/redhat-release CentOS L ...

  6. C语言细节注意

    前段时间用C语言写了个小的程序,也算是复习了下好久没有用的C语言.也是有好多的坑了,哈哈. 1.C语言的结构体 结构体的命名最好能够做到规范.因为不同的 编译环境下,不是很规范的命名有时候会导致莫名其 ...

  7. jsp基础知识点——思维导图

    如图 思维导图图片链接 http://www.edrawsoft.cn/viewer/public/s/0b8cd083478732 有道云笔记图片链接 http://note.youdao.com/ ...

  8. RQN 273 马棚问题 dp

    PID273 / 马棚问题  2016-07-29 18:21:55 运行耗时:1624 ms 运行内存:16248 KB 题目描述 每天,小明和他的马外出,然后他们一边跑一边玩耍.当他们结束的时候, ...

  9. SQL使用事务

    BEGIN TRANSACTION--开始事务 DECLARE @errorSun INT --定义错误计数器 SET @errorSun=0 --没错为0 UPDATE a SET id=232 W ...

  10. 智课雅思词汇---二十六、形容词后缀-ble

    智课雅思词汇---二十六.形容词后缀-ble 一.总结 一句话总结: assemble 英 [ə'semb(ə)l]  美 [ə'sɛmbl]  vt. 集合,聚集:装配:收集 vi. 集合,聚集 [ ...