虎杖和东堂的不义游戏

 题目:

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

虎杖和东堂的不义游戏_第1张图片

输入格式:

输入在一行中给出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
int h(int n,char a,char b,char c)
{
    if(n==0)
        return;
    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:目标杆

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

虎杖和东堂的不义游戏_第2张图片

虎杖和东堂的不义游戏_第3张图片

虎杖和东堂的不义游戏_第4张图片

虎杖和东堂的不义游戏_第5张图片

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

虎杖和东堂的不义游戏_第6张图片

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

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

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

第二步则不需要拆解;

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

虎杖和东堂的不义游戏_第7张图片

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

虎杖和东堂的不义游戏_第8张图片

你可能感兴趣的:(每日一题,算法,c语言,游戏,学习)