码迷,mamicode.com
首页 > 其他好文 > 详细

汉诺塔

时间:2017-03-14 00:38:04      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:proc   算法   输出   地方   exit   经典算法   bsp   相同   ==   

/*
     经典算法——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
    请按任意键继续. . .
*/

汉诺塔

标签:proc   算法   输出   地方   exit   经典算法   bsp   相同   ==   

原文地址:http://www.cnblogs.com/lnlin/p/6545616.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!