题解 | #循环汉诺塔#

循环汉诺塔

https://www.nowcoder.com/practice/cdf0808f841748faba058c8ef538c731

/*

写了半天没看到要取模.....

用大数加法输出的原始数据,但是核心思路是没错的

和普通的汉诺塔一样,无非就是加了方向,推导迭代表达即可

*/

#include <iostream>

#include <vector>

using namespace std;

int num;

//大数加法

//大端序存储

vector<int> sum(vector<int> added, vector<int> add){

    //保证长度一致

    if(add.size()>added.size()){

        while(add.size()!=added.size()){

            added.push_back(0);

        }

    }else{

        while(add.size()!=added.size()){

            add.push_back(0);      

        }

    }

    int temp=0;//进位

    int sum=0;

    for(int i=0;i<add.size();++i){

        sum = add[i] + added[i] + temp;

        if(sum>=10){

            sum = sum-10;

            temp = 1;

        }else{

            temp = 0;

        }

        added[i] = sum;

    }

    if(temp!=0){

        added.push_back(1);

    }

    return added;

}

//递归

void find(vector<int>& Dp_A_B,vector<int>& Dp_A_C,int id){

    if(id==num){

        return;

    }

    vector<int> Dp_A_B_next = sum(sum(Dp_A_C, Dp_A_C),{1});

    //cout<<Dp_A_B_next[0]<<endl;

    vector<int> Dp_A_C_next = sum(sum(sum(Dp_A_C, Dp_A_C),{2}),Dp_A_B);

    //cout<<Dp_A_C_next[0]<<endl;

    find(Dp_A_B_next,Dp_A_C_next,id+1);

    Dp_A_B = Dp_A_B_next;

    Dp_A_C = Dp_A_C_next;

}

int main() {

    int n;

    cin>>n;

    num = n;

   

    vector<int> Dp_A_B = {0};

    vector<int> Dp_A_C = {0};

    find(Dp_A_B, Dp_A_C, 0);

    for(int i=1;i<=Dp_A_B.size();++i){

        cout<<Dp_A_B[Dp_A_B.size()-i];

    }

    cout<<" ";

    for(int j=1;j<=Dp_A_C.size();++j){

       cout<<Dp_A_C[Dp_A_C.size()-j];

    }

    return 0;

}

// 64 位输出请用 printf("%lld")

全部评论

相关推荐

群星之怒:不是哥们,你就不好奇瘫痪三十年的老植物人是啥样的吗?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务