汉诺塔问题

来源:互联网 发布:深圳十六号公寓知乎 编辑:程序博客网 时间:2024/05/22 07:42
#include <stdio.h>#include <stdlib.h>/***法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:**在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜**板上插着三根宝石针。印度教的主神梵天在创造世界的时**候,在其中一根针上从下到上地穿好了由大到小的64片金**片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣**在按照下面的法则移动这些金片:一次只移动一片,不管**在哪根针上,小片必须在大片上面。僧侣们预言,当所有**的金片都从梵天穿好的那根针上移到另外一根针上时,世**界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同**归于尽*//***这其实是一个经典的递归问题**可以这样的考虑:**-先将前63个盘子移动到Y上,确保大盘在小盘下。**-再将最底下的第64个盘子移动到Z上。**-最后将Y上的63个盘子移动到Z上。**问题一:将X上的63个盘子借助Z移到Y上**-先将前62个盘子移动到Z上**-再将最底下的第63个盘子移动到Y上**-最后将Z上的62个盘子移动到Y上**问题二:将Y上的63个盘子借助X移到Z上**-先将前62个盘子移动到X上**-再将最底下的第63个盘子移动到Z上**-最后将X上的62个盘子移动到Y上*//*将n个盘子从X借助Y移动到Z*/void move(int n,char x,char y,char z){    if(n==1)    {        printf("%c->%c\n",x,z);    }    else    {        move(n-1,x,z,y);        //将n-1个盘子从x借助z移到y上        printf("%c->%c\n",x,z);        move(n-1,y,x,z);        //将第n个盘子从x移到z上    }}int main(){    int n;    printf("请输入汉诺塔的层数:");    scanf("%d",&n);    printf("移动的步骤如下:\n");    move(n,'x','y','z');    return 0;}

0 0
原创粉丝点击