双色汉诺塔 算法 (递归)

#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;

}

posted @ 2012-09-27 21:03  缺少主人公  阅读(2276)  评论(0编辑  收藏  举报