汉诺塔

/*
     经典算法——1 河内之塔: 有三个柱子和 n 个大小各不相同的
  盘子。开始时,所有盘子以塔状叠放在柱子 A 上,要求一定规
  则,将柱子 A 上的所有盘子移到柱子 B 上,柱子 C 为移动缓
  冲柱。
  移动规则如下:
     (1)一次只能移动一个盘子。
  (2)任何时候不能把盘子放在比他小的盘子下面。 
*/  
/*
    采用递归的方法解决此问题。
 (1)描述解决问题的思想:
        1. 若只有一个盘子,则可以直接从A移动到B
     2. 若盘子数大于 1 ,则需要先将 n-1 个盘子从 A 移动
     到缓冲区 C ,再将 A 中剩下的最大的一个盘子移动到终
     点盘 B ,最后再将缓冲区 C 上的 n-1 个盘子移动到终
     点盘 B 。
 (2)递归算法(见下面代码)          
*/
# include <stdio.h> 
void hanoi(int, char, char, char); 
int main(void)
{
    int disks;  // 定义盘子总数。
    printf("请输入盘子总数目:");
    scanf("%d", &disks);
    printf("\n");
    hanoi(disks, 'A', 'B', 'C');  //  A 为最开始盘子所在的地方 B 为最后盘子要放置的地方  C 为缓冲地带  
 
    return 0;
}
void hanoi(int n, char A, char B, char C)   //  A 为最开始盘子所在的地方 B 为最后盘子要放置的地方  C 为缓冲地带  
{ 
    if (1 == n)
    {
        printf("%c 移到 %c", A, B);
    }
    else  // 整个移动过程中的一个基本单元 
    {
        // hanoi 函数中的不同的盘子作用要与形参一致, 见下一个改变了盘子功能的程序 
        hanoi(n-1, A, C, B);  // 将 n-1 个盘子从起始区移到缓冲区
        printf("\n");
        printf("%c 移到 %c", A, B);  // 将最大的盘子移到终点区 
        printf("\n"); 
        hanoi(n-1, C, B, A);  // 将缓冲区的 n-1 个盘子移到终点区
          printf("\n");   
    }
    printf("一共需要执行%d次!\n", i);
 
    return;
}
/*
      输出结果: 
          请输入盘子总数目:4
    A 移到 C
    A 移到 B
    C 移到 B
    
    A 移到 C
    B 移到 A
    B 移到 C
    A 移到 C
    
    
    A 移到 B
    C 移到 B
    C 移到 A
    B 移到 A
    
    C 移到 B
    A 移到 C
    A 移到 B
    C 移到 B
    
    
    
    --------------------------------
    Process exited after 1.463 seconds with return value 0
    请按任意键继续. . .
*/

 

posted @ 2017-03-13 23:13  荒唐了年少  阅读(152)  评论(0编辑  收藏  举报