题解 | 大吉大利,今晚吃鸡

大吉大利,今晚吃鸡

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

#include <stdio.h>
//常规的汉诺塔,位置不重要,两道题都可以画图推一下
// int Hanoi(int n){
//     if(n==1){
//         return 1;
//     }else {
//         return 2*Hanoi(n-1)+1;
//     }
// }

//移动限制导致大盘子和集合的移动次数都增加了
int Hanoi_Neibor(int n){
    if(n==1){
        return 2;
    }else{
        return 3*Hanoi_Neibor(n-1)+2;
    }
}

int main() {
    int n,count=0;
    while(scanf("%d",&n)!=EOF){
    //汉诺塔f(n)=2*f(n-1)+1递推可知 总的移动次数可以分解为两次小集合的移动f(n-1)+新增盘子的移动1
    //X 0 0 -> X- 0 x == X x 0 -> X- x new -> X- 0 x+
    // count=Hanoi(n);

    //但本题是汉诺塔的变体!!!只能移动到相邻位置
    //X 0 x != X x 0
    //把集合的移动看作整体,前一次集合的状态一定是X 0 x (+f(n-1))-> X- 1 x (+1)-> X-/x 1 0 (+f(n-1))
    //-> X-/x 0 1 (+1) -> X- 0 x+ (+f(n-1))
    //整理可得f(n)=3*f(n-1)+2
    count=Hanoi_Neibor(n);
    printf("%d\n",count);
    }
    return 0;
}

全部评论

相关推荐

点赞 评论 收藏
分享
面了100年面试不知...:头像换成柯南再试试
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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