美文网首页
2019-05-16(栈 递归 ----hanoi塔问题)

2019-05-16(栈 递归 ----hanoi塔问题)

作者: 常人 | 来源:发表于2019-05-16 12:47 被阅读0次

严版数据结构:p55

问题描述:

假设有三座塔:X,Y,Z塔,在塔X上插有n个直径大小各不相同的,依小到大编号 1、2、3、4......n的圆盘(如图)现在需要 将 X 下的圆盘转移到塔座Z底下,任然以同样顺序叠排。

同时需要遵循的规则:

1、每次只能移动一个圆盘;
2、圆盘可以插入到X 、Y 和 Z 的任意一座塔;
3、任何时刻都不能将较大的圆盘压到较小的圆盘之上;

如何实现移动圆盘:

如果 n = 1; 直接 从 X 移动到 Z;
如果 n >1,需要借助Y作为辅助的塔坐,
若能设法将 X 中 n之上的 n-1个元素 移动到Y之上, 然后将n 移动到Z 塔座上,然后再讲Y上的n-1个盘移动到Z之上。

如果问题是将X的编号为 n-1个盘转移到z只是和上面的问题的规模缩小一是一样的。

图片引用地址:https://blog.csdn.net/cml__96/article/details/82755706

image.png

下面是关于hanoi塔问题的C语言函数(数据结构)描述:

void hanoi(int n, char x, char y, char  z){
    printf("%i move disk %i from %c to %c \n", ++c, n, x, z);
    {
        if (n == 1){
            move(x, 1, z);"直接将X中的1个元素转移到Z 中"
        }
        else{
            hanoi(n - 1, x, y, z); "将n-1个元素 Z作为辅助塔,将X上编号为1 到 n-1个数据转移到Y上"
            move(x, n, z);  " 将X上编号为n 的圆盘 x移动到z"
            hanoi(n - 1, y, x, z);" 将 y上的编号的1到n-1的盘移动待z,x作为辅助塔"
        }
    }
}

C语言 IDE 实现版:

#include <stdio.h>
#include <string.h>
void move(int n, int x, int y, int z)
{
    if (n == 1)
        printf("%c--->%c\n", x, z);
    else
    {
        move(n - 1, x, z, y);
        printf("%c--->%c\n", x, z);
        move(n - 1, y, x, z);
    }
}
int main()
{
    int num;
    printf("input number:\n");
    scanf_s("%d", &num);
    printf("the step to moving %2d diskes:\n", num);
    move(num, '1', '2', '3');
    system("pause");
    return 0;
}


image.png

相关文章

网友评论

      本文标题:2019-05-16(栈 递归 ----hanoi塔问题)

      本文链接:https://www.haomeiwen.com/subject/efgbaqtx.html