汉诺塔

Posted 荒唐了年少

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汉诺塔相关的知识,希望对你有一定的参考价值。

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

以上是关于汉诺塔的主要内容,如果未能解决你的问题,请参考以下文章

关于汉诺塔问题

汉诺塔游戏规则

汉诺塔内存分析(python)

汉诺塔的C语言代码怎么写啊

分治算法——汉诺塔问题

代写Haskell程序 汉诺塔汉诺塔编程代码代写