openjudge 4147 汉诺塔问题(Hanoi)

现在越来越懒了,直接丢链接

分析:
我这个人就是有个毛病,喜欢考古

这道题几年前就知道思路了,
但是今天看起来,实现的时候还有些小问题
所以干脆借这道题回顾一下递归的想法

题目已经给出了3个物体的移动方法
实际上,三个柱子的状态只会有以下几种:

1.A柱子上从小到大排列好了n个物体,B空,C空
这种情况下,很显然我们需要把n-1个物体从A–>B,
最大的第n个就可以直接移动到C,
显然现在的状态变成了:
2.A空,B有n-1个按照规定摆放的物体,C有一个最大的物体
这种情况下,就和第一种状态大同小异,
把B上的n-1个物体移动到A,第n-1个直接从B移动到C
现在状态就回归了1

这位dalao讲的很好

这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;

int n;
char ch[100];

void doit(int now,int x,int y,int z)   //物体在x上,目标是z 
{
    if (now==1)
    {   //只有一个就直接移动 
        printf("%d:%c->%c
",now,ch[x],ch[z]);
        return;
    }
    doit(now-1,x,z,y);
    printf("%d:%c->%c
",now,ch[x],ch[z]);
    doit(now-1,y,x,z);
}

int main()
{
    scanf("%d",&n);
    for (int i=1;i<=3;i++) cin>>ch[i];
    doit(n,1,2,3);
    return 0;
}
原文地址:https://www.cnblogs.com/wutongtong3117/p/7673041.html