虎杖和东堂的不义游戏

 题目:

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

79861a11fe6d03ab0ad9bc270c9ba931.png

输入格式:

输入在一行中给出1个正整数n。

输出格式:

输出搬动盘子过程。

输入样例:

在这里给出一组输入。例如:

3

输出样例:

在这里给出相应的输出。例如:

No.1 disk: a->c
No.2 disk: a->b
No.1 disk: c->b
No.3 disk: a->c
No.1 disk: b->a
No.2 disk: b->c
No.1 disk: a->c

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

C (gcc)

答案:

#include<stdio.h>
int h(int n,char a,char b,char c)
{
    if(n==0)
        return 0;
    else
    {
        h(n-1,a,c,b);
        printf("No.%d disk: %c->%c\n",n,a,c);
        h(n-1,b,a,c);
    }
}
int main() {
    int n;
    scanf ("%d", &n);
        h(n, 'a', 'b', 'c');
    return 0;
}

方法讲解:

首先,我们需要把问题简化寻找方法,

例如:将三个杆子分为 A:主源杆 B:借力杆 C:目标杆

           将两个圆盘移动到目标杆,可以先将其分为两部分,上和下,过程如下:

1c086a2bec124cdeaab22a2b81dd4f4b.jpeg

a51f6601404f4711a00d3e0203801ee0.jpeg

4168c3c6a2a44c5c9f9252e9a8863787.jpeg

efa8a96791194f6a89b469675843821d.jpeg

由此类推,当要移动三个圆盘的时候,我们可以将其分为上面和最下面一个,重复进行以上操作,

2762242f7b2c44caac8654c0b23ed9c3.jpeg

所以我们移动所有的圆盘时,可以进行如下操作:

而第一步和第三步是需要拆解的,

第一步中就将原本的接力杆变成了目标杆,所以需要B和C互换身份,B就成了目标杆,C变成了接力杆;

第二步则不需要拆解;

第三步中将主源杆变成了接力杆,A和B互换身份;

1bb12bac342541da85c738659b67530c.jpeg

以此类推进行拆解,最终结果图如下:

0aad376b69a749aa9bf5733b6f40b832.jpeg

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值