题解 | #牛牛的汉诺塔#

思路

考察递归记忆化搜索,记忆化搜索忘了咋写,利用同个n的递归移动次数相同的性质可将递归次数减少一半;移动情况以及次数信息由map维护

#include <bits/stdc++.h>
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0)
#define ll long long
#define endl '\n'
using namespace std;

map<pair<char,char>,ll> mp;
void Init_map(){
    char c = 'A';
    for(int i = 0;i <= 2;i++)
        for(int j = 0;j <= 2;j++)
            if(i == j) continue;
            else mp[make_pair(c+i,c+j)] = 0;
}
void disp_map(){
    char c = 'A';
    ll sum = 0;
    for(int i = 0;i <= 2;i++)
        for(int j = 0;j <= 2;j++)
            if(i == j) continue;
            else{
                cout<<char(c+i)<<"->"<<char(c+j)<<":";
                cout<<mp[make_pair(c+i,c+j)]<<endl;
                sum += mp[make_pair(c+i,c+j)];
            }
    cout<<"SUM:"<<sum;
}

void Hanoi(int n,char a,char b,char c){    //意为将n个盘从a柱移到c柱,b为中转柱
    if(n == 1) mp[make_pair(a,c)]++;
    else{
        Hanoi(n-1,a,c,b);
        //Hanoi(n-1,b,a,c);
        ll tmp1 = mp[make_pair(c,a)],tmp2 = mp[make_pair(c,b)],
        tmp3 = mp[make_pair(a,c)],tmp4 = mp[make_pair(a,b)],
        tmp5 = mp[make_pair(b,c)],tmp6 = mp[make_pair(b,a)];
        mp[make_pair(a,b)] += tmp1;
        mp[make_pair(a,c)] += tmp2;
        mp[make_pair(b,a)] += tmp3;
        mp[make_pair(b,c)] += tmp4;
        mp[make_pair(c,a)] += tmp5;
        mp[make_pair(c,b)] += tmp6;
        //两次n-1递归中移动次数相等,只需算一次递归即可
        mp[make_pair(a,c)]++;
    }
}

int main(){
    ios;
    int n;
    cin>>n;
    Init_map();    //初始化每种移动情况数
    Hanoi(n,'A','B','C');
    disp_map();    //打印结果
    return 0;
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 11:27
明天又是董事长面,啥时候是个头啊
积极向上的林同学:董事长亲自面试
点赞 评论 收藏
分享
头顶尖尖的程序员:我是26届的不太懂,25届不应该是找的正式工作吗?为什么还在找实习?大四还实习的话是为了能转正的的岗位吗
点赞 评论 收藏
分享
人力小鱼姐:实习经历没有什么含金量,咖啡店员迎宾这种就别写了,其他两段包装一下 想找人力相关的话,总结一下个人优势,结合校园经历里有相关性的部分,加一段自我评价
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-11 15:08
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务