大吉大利,今晚吃鸡

大吉大利,今晚吃鸡

https://ac.nowcoder.com/acm/contest/21763/1009

本题与经典汉罗塔很像,但由于只能相邻移动的特点有导致移动方法有些不同。
假设只有两个盘子:由于只能相邻移动所以不能先从A到B,再A到C,因为A到B之后中间那根柱子由于最上面的盘子挡着呢,所以过不去。
那么就只能通过B柱子一次性移动到C才可以将下面的盘子从A到B。然后还需要将C上面的盘子借助B移动到A,将C柱子的位置留出来让B上面的大盘子移动到C。
最后让A到C就可以了。
当然这是2个盘子的情况。扩展到n个盘子的情况就是:
先将n-1个盘子从A到C;
再第n个盘子将A到B;
再n-1个盘子将C到A;
再第n个盘子将B到C;
在前n-1个盘子将A到C;
中间直接移动的两步直接cnt++就可以了。
代码:
#include <bits/stdc++.h>


using namespace std;

int cnt = 0;
void hanoi(char a, char b, char c, int n) {
    if (n==0) return ;
    hanoi(a, b, c, n-1);
    cnt++;
    hanoi(c, b, a, n-1);
    cnt++;
    hanoi(a, b, c, n-1);
}

int main() {
    int n;
    while (cin>>n) {
        cnt = 0;
        hanoi('a', 'b', 'c', n);
        cout<<cnt<<endl;
    }
    
    return 0;
}
另一种方法:
从上面总结出来的规律可以得到:F(n)=F(n-1)+1+F(n-1)+1+F(n-1),左右都加上一可以得到:F(n)+1=3(F(n-1)+1) 可以得到F(n) = 3^n-1;
直接计算即可。
全部评论

相关推荐

点赞 评论 收藏
分享
仁者伍敌:难怪小公司那么挑剔,让你们这些大佬把位置拿了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-09 16:15
我应届生,去年10月份开始在这家公司实习,到今年10月份正好一年想(实习+试用期),在想要不要提前9月份就离职,这样好找工作些,但又差一个月满一年,又怕10月份国庆回来离职,容易错过了下半年的金九银十,到年底容易gap到年后
小破站_程序员YT:说这家公司不好吧,你干了快一年 说这家公司好吧,你刚毕业就想跑路说你不懂行情吧,你怕错过金九银十说 你懂行情吧,校招阶段在实习,毕业社招想换工作 哥们,我该怎么劝你留下来呢
应届生,你找到工作了吗
点赞 评论 收藏
分享
评论
7
收藏
分享

创作者周榜

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