汉诺塔新论


一天,桶子在刷abc时遇到了一个难题:已知有三个柱子和n个圆盘,且n个圆盘起始都在第一个柱子上,要求给出解决这个问题的过程。

桶子经过苦思冥想,仍旧无法解答这个问题,于是他决定求助冈部伦太郎。但是他觉得不能完全借鉴别人的答案,所以就决定把问题分成三个步骤。

第一步:求助冈部伦太郎,得到把一号柱子上除了最后一个圆盘外的所有圆盘放到二号柱子上的过程。

第二步:自己把一号柱子上的最后一个圆盘移动到三号柱子。

第三步:求助真由理,得到把二号柱子上的所有圆盘放到三号柱子上的过程。

“冈部,这里有一个问题,是……”

“不用说了,没有什么问题能难倒我凤凰院凶真!”

然而,听完这个问题后,冈部伦太郎也犯了难。他也解决不了这个问题。然而,他猜到了桶子想干什么,于是冈部决定有样学样。

冈部伦太郎决定把他的问题分为三步。

第一步:求助牧濑红莉栖,得到把一号柱子上除了最后一个圆盘外的所有圆盘放到三号柱子上的过程。

第二步:自己把一号柱子上的最后一个圆盘移动到二号柱子。

第三步:求助菲利斯·喵喵,得到把三号柱子上的所有圆盘放到二号柱子上的过程。

在不断的循环下,每个人都重复上一个人做过的事。

最终,求助到了打工战士的头上,此时,她只需要移动一个圆盘,于是她出色地完成了任务。然后,她把答案告诉了问她这个问题的人……

在实验室成员的不懈努力下,桶子终于AC了这道题目。

代码如下

#include
#include
using namespace std;
int n;
int a[200];

void out(int x){
    for(int i=x;i<=n;i++){
        printf("%d ",a[i]);
    }
    for(int i=1;i){
        printf("%d ",a[i]);
    }
    printf("\n");
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    
    out(1);
    for(int i=n;i>=2;i--){
        out(i);
    }
    
    return 0;
}