汉诺塔模板

汉诺塔的模板

递归做法(超时):

#include <iostream>
#include <vector>
#include <stack>
using namespace std;
stack<int> S[3];
long long sum,hp;

void move(int A,int B){
    ++sum;
    int tmp = S[A].top();
    S[A].pop();
    hp += tmp;
    S[B].push(tmp);
}

void hanoi(int A,int B,int C,int n){
    if(n == 1){
        move(A,C);
        return;
    }else{
        hanoi(A,C,B,n-1);
        move(A,C);
        hanoi(B,A,C,n-1);        
    }
}

int main(){
    int n;
    cin >> n;
    for(int i=n;i>=1;--i){
        S[0].push(i);
    }
    hanoi(0,1,2,n);
    cout << sum << " " << hp << endl;
    return 0;
}

 

递推做法:

f[1] = 1;
f[n] = f[n-1] + 1 + f[n-1];
f[n] = (1LL << n) - 1;//大数避免pow 

 

posted @ 2019-03-05 19:52  zz2108828  阅读(206)  评论(0编辑  收藏  举报