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个盘子每个盘子的移动次数。
  • 相关阅读:
    BZOJ1800 fly 飞行棋 [几何]
    Cf #434 Div.1 D Wizard's Tour [构造题]
    Last mile of the way [树形dp+重链剖分]
    World Of Our Own [Lucas+思维题]
    vue 初级小总结
    转-redux-saga
    【转】react-native开发混合App-github开源项目
    react中路由的跳转
    Lodash 浓缩
    jq的attr、prop和data区别
  • 原文地址:https://www.cnblogs.com/xiaofengqaq/p/10595669.html
Copyright © 2011-2022 走看看