汉诺塔问题

汉诺塔问题
递归三部曲解题:

  1. 当只有一个盘子的时候:

汉诺塔问题
汉诺塔问题
汉诺塔问题
汉诺塔问题

  • 当有n个盘子的时候:

汉诺塔问题
汉诺塔问题
汉诺塔问题

汉诺塔问题
汉诺塔问题
汉诺塔问题

  • 结束条件:当只有一个盘子没有移动的时候
  • 返回值:void
  • 本级递归做什么:将n-1个盘子由A移动到B,当最大的盘子从A移动到C后,把B上的n-1个盘子从B移动到C
class Solution {
public:
    void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {
        int n = A.size();
        move(n, A, B, C);
    }

    void move(int n, vector<int>& A, vector<int>& B, vector<int>& C){
        if (n == 1){
            C.push_back(A.back());
            A.pop_back();
            return;
        }

        move(n-1, A, C, B);    // 将A上面n-1个通过C移到B
        C.push_back(A.back());  // 将A最后一个移到C
        A.pop_back();          // 这时,A空了
        move(n-1, B, A, C);     // 将B上面n-1个通过空的A移到C
    }
};

汉诺塔问题

class Solution {
public:
    void hanota(vector<int>& A, vector<int>& B, vector<int>& C)
    {
        stack<int> s;
        //把A的n-1个盘子放入栈中
        while (A.size() != 1)
        {
            s.push(A.front());
            A.erase(A.begin());
       }
        while (!s.empty())
        {
            B.push_back(s.top());
            s.pop();
        }
        //B的n-1个盘子移动到C
        vector<int>::reverse_iterator it = B.rbegin();
        for (; it != B.rend(); it++)
        {
            C.push_back((*it));
        }
        //A的第n个盘子移动到C---
        C.emplace_back(A[A.size() - 1]);
    }
};

汉诺塔问题

上一篇:通过模拟JDK中的动态代理,由浅入深讲解动态代理思想.


下一篇:​深入理解[代理模式]原理与技术