双色汉诺塔 算法 (递归)

十年热恋 提交于 2019-12-28 19:42:09

#include<stdio.h>

//将n个盘子A->C借助B

void move(int n,char a,char b,char c)

{

         if(n==1)

         {

                   printf("%c->%c\n",a,c);

                   printf("%c->%c\n",a,c);

         }

         else

         {

                   move(n-1,a,c,b);

                   printf("%c->%c\n",a,c);

                   printf("%c->%c\n",a,c);

                   move(n-1,b,a,c);

         }

}

//根据颜色移动

void ColorTwoMove(int n,char a,char b,char c)

{

 

         int i=n/2;                                       //分两组,因为只是颜色不同,一次移动两个。     

         for(;i>1;i--)                                    //下面主要是把两个颜色不一样,大小一样的分开放在两个柱子上。

         {

                   move(i-1,a,c,b);                 //将2*(i-1)个A->B借助C

                   move(1,a,b,c);                   //将A上剩下的两个移动到C上

                   move(i-1,b,c,a);                 //将B上的2*(i-1)个 B->A借助C

                   printf("%c->%c\n",c,b); //C上面现在是两个颜色不一样大小一样的盘子,将其中的1个C->B

                                                                          

         }                                                               

                                                                           //下面是最上面的两个的两个大小一样,颜色不一的最小的盘子

         printf("%c->%c\n",a,c);            //将第一个移动到C上

         printf("%c->%c\n",a,b);            //将第二个移动到B上

        

 

}

int main(){

         int n;

         printf("请输入盘数:");

         scanf("%d",&n);

 

         char a='A';

         char b='B';

         char c='C';

         ColorTwoMove(n,a,b,c);

         //      move(n,a,b,c);

         return 0;

}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!