/* 经典算法——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(" "); 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(" "); printf("%c 移到 %c", A, B); // 将最大的盘子移到终点区 printf(" "); hanoi(n-1, C, B, A); // 将缓冲区的 n-1 个盘子移到终点区 printf(" "); } printf("一共需要执行%d次! ", 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 请按任意键继续. . . */