用递归法求汉诺塔移盘问题

#include <stdio.h> void main() { void hanoi(int,char,char,char); void move(char,char); unsigned long steps(int); int n; printf(“A座上有多少个盘子?(0<=盘子数<=32):”); lable:scanf(“%d”,&n); if(n<=0||n>=33) { printf(“请重新输入!输入的数不应该小于等于0和或大于等于32:”);//因为C语言中,整型最大能表示的范围是0~4294967295。如果大于32将无法正确计算出总的步骤数 goto lable; } printf(“把%d个盘子从A座移动到C座共需%u个步骤。具体步骤如下:/n”,n,steps(n));//steps()函数用于计算总步数 printf(“000 01 02 03 04 05 06 07 08 09 10/n”);//行号 hanoi(n,’A’,’B’,’C’);//调用hanoi()函数,并分别对hanoi()函数的形参A、B、C赋值为字符’A’、’B’、’C’ printf(“/n”); } unsigned long steps(int n)//字义函数为无符号长整型,用于计算移动盘子的总步数 { unsigned long total=1; for(;n>0;n–)//求2的n次方 total=total*2; total=total-1;//汉诺塔移动盘子的总步骤数等于2的n次方减1 return total; } void hanoi(int n,char A,char B,char C)//解汉诺塔移盘问题的递归函数 { if(n==1) move(A,C);//只移动一个盘的时候则无需要借助B座,直接从A座移动到C座。 else { hanoi(n-1,A,C,B);//首先借助C座将A座上的n-1个盘移动到B座上,即只留最一个盘(最底下、最大的盘)在A座上。 move(A,C);//然后把A座上留下的那个盘移动到C座上。 hanoi(n-1,B,A,C);//最后再借助空置的A座把B座上的盘移动到C座上。至此,成功把所有的盘从A座上移动到C座上,当然,这个过程要借助B座来完成。 } } void move(char x,char y)//本函数仅打印出移动的过程,并不对A、B、C座的数据进行交换 { static i=0,j=0; if(j==0) printf(“00%-d “,++j);//第1行行标 printf(“%c—>%-3c”,x,y);//打印移动过程 i++; if(i%10==0) { j=j+1;//用于行标控制 if(j<=9) printf(“/n00%-d “,j);//如果行数小于等于9则在数的左侧输出两个0用于占位置; else if(j<=99) printf(“/n0%-d “,j);//如果行数大于9而小于等于99则在数的左侧输出一个0用于占位置 else printf(“/n%-d “,j);//控制换行 } }

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/huangyiyun/article/details/4302206
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞