汉诺塔问题

GitHub跳转原题关系图返回列表

题意与原解析均从本地 OpenJudge 缓存迁移。

OJ: noi_openjudge

题目 ID: ch0202-6261

难度:未知

标签:

日期: 2026-07-30 23:01

题意

完整题面见同目录的 problem.md

思路

代码

cpp
#include <cstdio>
int n;
//柱子 
int pan[4][100];
int cnt[4] = {0};
char z[5];

int get_panzi_from_zhuzi(int i){
    int a = pan[i][cnt[i]];
    cnt[i]--;
    return a;
}
void put_panzi_to_zhuzi(int i,int a){
    cnt[i]++;
    pan[i][cnt[i]] =  a;
}

void put(int i,int j){
    int a = get_panzi_from_zhuzi(i);
    printf("%c->%d->%c\n",z[i],a,z[j]);
    put_panzi_to_zhuzi(j,a);
}

// x 盘子数量 a 当前 b 辅助  c 目的
void hn(int x,int a,int b,int c){
    if( x == 1){
        put(a,c);
        return ;
    }
    hn(x-1,a,c,b);
    put(a,c);
    hn(x-1,b,a,c);
}

int main(){
    scanf("%d",&n);
    int i;
    for(i=n;i>=1;i--){
        cnt[1]++;
        pan[1][cnt[1]] = i;
    }
    char str[3];
    for (i=1;i<=3;i++){
        scanf("%s",str);
        z[i] = str[0];
    }
    hn(n,1,3,2);

    return 0;
}

复杂度

总结