目录
1.汉诺塔游戏的规则
2.汉诺塔游戏的图解
3.实现汉诺塔的思路
4.代码呈现
4.1 模拟移动的代码
4.2 Hanoi的递归代码
4.3 完整代码
5.运行结果
1.汉诺塔游戏的规则
汉诺塔的内容:将A柱上的n个盘子,通过B柱全部转移到C柱上
规则:1.小盘子必须在大盘子上。
2.每次只能移动一个盘子。
2.汉诺塔游戏的图解
盘子数 | 步数 | 规律 |
1 | 1 | 2^1-1 |
2 | 3 | 2^2-1 |
3 | 7 | 2^3-1 |
n | 2^n-1 | 2^n-1 |
以3个盘子为例,图示如下:
看到这里我们就能发现,从三个盘子开始,想要完成游戏要求的步骤会越来越多,越来越繁琐,那我们不妨思考一下如何将这个问题简化。
3.实现汉诺塔的思路
我们思考一下,可以发现,将这些盘子设为n,底下最大的盘子为1,则其他盘子为n-1。
这些n-1个盘子都需要经过将他们整体移动到B柱上,然后再将最大的盘子移动到C柱上,最后将n-1个盘子移动到C柱上。
因此,我们就可以将这一个复杂的大问题转化为与原问题相似,但是规模较小的问题(递归思想)
4.代码呈现
4.1模拟移动的代码
void move(char x, char y)//用move函数来移动
{
printf("%c->%c\n", x, y);
}
4.2Hanoi的递归代码
void Hanoi(int n, char a, char b, char c)//a为原桩,b为协助桩,c为目标桩
{
if (n == 1)//如果只有一个盘子则通过a移动到c
{
move(a, c);
}
else
{
Hanoi(n - 1,a ,c, b);//先将n-1个盘子通过C移动到B
move(a,c);//把最大的盘子从A移动到C
Hanoi(n - 1,b , a, c);//最后将n-1个盘子从B移动到C
}
}
4.3完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void move(char x, char y)//用move函数来移动
{
printf("%c->%c\n", x, y);
}
void Hanoi(int n, char a, char b, char c)//a为原桩,b为协助桩,c为目标桩
{
if (n == 1)//如果只有一个盘子则通过a移动到c
{
move(a, c);
}
else
{
Hanoi(n - 1,a ,c, b);//先将n-1个盘子通过C移动到B
move(a,c);//把最大的盘子从A移动到C
Hanoi(n - 1,b , a, c);//最后将n-1个盘子从B移动到C
}
}
int main()
{
int n;
printf("请输入你的盘子数量:");
scanf("%d", &n);
Hanoi(n, 'A', 'B', 'C');
return 0;
}
5.运行结果
如果这篇文章有什么不足,欢迎大家在评论底下留言。