zoukankan      html  css  js  c++  java
  • 面试题 08.06. 汉诺塔问题

    在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:
    (1) 每次只能移动一个盘子;
    (2) 盘子只能从柱子顶端滑出移到下一根柱子;
    (3) 盘子只能叠在比它大的盘子上。

    请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。

    你需要原地修改栈。

    示例1:

    输入:A = [2, 1, 0], B = [], C = []
    输出:C = [2, 1, 0]
    示例2:

    输入:A = [1, 0], B = [], C = []
    输出:C = [1, 0]
    提示:

    A中盘子的数目不大于14个。

    class Solution {
    private:
        void move(stack<int> &a, stack<int> &b, stack<int> &c, int num){
            if(num == 1){
                c.push(a.top());
                a.pop();
                return ;
            }
    
            move(a, c, b, num-1);
            c.push(a.top());
            a.pop();
            move(b, a, c, num-1);
        }
    public:
        void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {
            //C = A;
            stack<int> a;
            for(int i = 0; i < A.size(); ++i){
                a.push(A[i]);
            }
    
            stack<int> b, c;
            int num = A.size();
            move(a, b, c, num);
    
            C.resize(num);
            for(int i = num-1; i >= 0; --i){
                C[i] = c.top();
                c.pop();
            }
        }
    };
  • 相关阅读:
    SQL数据库inner join ,join,left join,full join(转)
    CSRF攻击(转)
    BZOJ1853: [Scoi2010]幸运数字
    BZOJ1935: [Shoi2007]Tree 园丁的烦恼
    BZOJ3289Mato的文件管理
    树状数组
    莫队算法
    如何在win上用Linux编c++
    Hash的应用
    关于指数循环节的证明
  • 原文地址:https://www.cnblogs.com/tianzeng/p/13458008.html
Copyright © 2011-2022 走看看