• 汉诺塔IX


    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=76447#problem/E

                       汉诺塔IX Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

    Description

    1,2,...,n表示n个盘子.数字大盘子就大.n个盘子放在第1根柱子上.大盘不能放在小盘上.
    在第1根柱子上的盘子是a[1],a[2],...,a[n]. a[1]=n,a[2]=n-1,...,a[n]=1.即a[1]是最下
    面的盘子.把n个盘子移动到第3根柱子.每次只能移动1个盘子,且大盘不能放在小盘上.
    问第m次移动的是那一个盘子.
     

    Input

    每行2个整数n (1 ≤ n ≤ 63) ,m≤ 2^n-1.n=m=0退出
     

    Output

    输出第m次移动的盘子的号数.
     

    Sample Input

    63 1 63 2 0 0
     

    Sample Output

    1 2
    看了,1个小时? 后悔没有坚持,后悔没有把想到的都想到,后悔,存在~
     
    代码超级简单
    #include<stdio.h>

    int main()
    {
        long long n, m, k;  // 2的63次方,超过int类型范围

        while(scanf("%lld%lld", &n, &m), n+m)
        {
            k = 1;
            while(m % 2 != 1)
            {
                k++;
                m /= 2;
            }
            printf("%lld ", k);
        }
        return 0;
    }
     
    之前推了前几个:前5个顺序应该是 1 21 3121 4121 3121 5121 3121 4121 3121 。
    看出来什么了吗没有,昨天其实都想到4放哪个柱子上的问题,由于什么,就把4按放第三个柱子上处理,5就变成了51213121312141213121,当n等于4的时候放第四个柱子上,当n等于5的时候,4放哪个柱子上都是一样,但5就不一样了。。醉了,脑子就那么一闪,就过去了。不过也不一定就能想出来。。
    让未来到来 让过去过去
  • 相关阅读:
    【Lintcode】112.Remove Duplicates from Sorted List
    【Lintcode】087.Remove Node in Binary Search Tree
    【Lintcode】011.Search Range in Binary Search Tree
    【Lintcode】095.Validate Binary Search Tree
    【Lintcode】069.Binary Tree Level Order Traversal
    【Lintcode】088.Lowest Common Ancestor
    【Lintcode】094.Binary Tree Maximum Path Sum
    【算法总结】二叉树
    库(静态库和动态库)
    从尾到头打印链表
  • 原文地址:https://www.cnblogs.com/Tinamei/p/4465736.html
Copyright © 2020-2023  润新知