汉诺塔
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
请按任意键继续. . .
*/
以上是关于汉诺塔的主要内容,如果未能解决你的问题,请参考以下文章