zoukankan      html  css  js  c++  java
  • #C++初学记录(初识汉诺塔)

    汉诺塔
    题目
    用1,2,...,n表示n个盘子,称为1号盘,2号盘,...。号数大盘子就大。经典的汉诺塔问
    题经常作为一个递归的经典例题存在。可能有人并不知道汉诺塔问题的典故。汉诺塔来源于
    印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小
    顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱
    子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘。我们
    知道最少需要移动2^64-1次.在移动过程中发现,有的圆盘移动次数多,有的少 。 告之盘
    子总数和盘号,计算该盘子的移动次数.
    Input
    包含多组数据,首先输入T,表示有T组数据.每个数据一行,是盘子的数目N(1<=N<=60)和盘
    号k(1<=k<=N)。
    Output
    对于每组数据,输出一个数,到达目标时k号盘需要的最少移动数。
    Sample Input
    2
    60 1
    3 1
    Sample Output
    576460752303423488
    4
    正确代码

    include

    typedef long long ll;

    include

    using namespace std;
    int main()
    {
    ll a[64]={0};
    int i;
    int t;
    int n,k;
    for(a[0]=i=1;i<=64;i++)
    {
    a[i]=a[i-1]*2;
    }
    scanf("%d",&t);
    while(t--)
    {
    scanf("%d %d",&n,&k);
    printf("%lld ",a[n-k]);
    }
    return 0;

    <font size=5 face="微软雅黑">**代码理解**
    <font size=4 face="微软雅黑">汉诺塔的问题是数学问题,通常汉诺塔问题都可以直接用数学公式进行运行和计算,该题的题意时要求求出编号K的碟子移动几次,由数学规律可以了解到,汉诺塔的每一个碟子的运动次数随着K值的增大而增大,切一次增多2倍,即a[i]=a[i-1]*2,由此可以求出64个盘子每个盘子的移动次数。
  • 相关阅读:
    不叹惜、不呼唤我也不哭泣
    WCF笔记(一)Service Layer and Channel Layer
    C#数据结构(四)树和二叉树
    Python and django(四)详解python中的数字和序列
    Python and django(三)python中的对象
    IIS与ASP.NET Http Runtime Pipeline
    迈进程序员的大门
    实例学习SSIS(四)使用日志记录和错误流重定向
    DbUtility alpha1版本发布
    关于ref和out的详细区别。
  • 原文地址:https://www.cnblogs.com/xiaofengqaq/p/10595669.html
Copyright © 2011-2022 走看看