【c语言第五剑】汉诺塔(Hanoi)问题

汉诺塔问题

在这里插入图片描述

1.汉诺塔(Hanoi)问题是什么

想要学习汉诺塔(Hanoi)问题,我们就要了解汉诺塔(Hanoi)是什么

汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?

2.汉诺塔(Hanoi)问题如何用c语言解决

在这里插入图片描述
假设现在有3个盘子,如果想移动到另一个柱子,就要把最大的柱子想办法移动到另一个柱子上,我们可以这样
第一步
在这里插入图片描述

!](https://img-blog.csdnimg.cn/048a137cdec8440fa59a1d3a01daee22.png)
第二步
在这里插入图片描述
第三步
在这里插入图片描述
我们发现,不管这个盘子有多少,我们想要移动到另外一个柱子,都需要借助另一根柱子才可移动,且需要三步
a>>c c>>b b>>c
但是以上猜想是我们在忽略最下方上面的n个盘子才得到的,而我们如果想得出结果,不能忽略他,这时候,就可以引用c语言一种特殊的方法

递归

显而易见,递归可以很轻松的让我们使用最下面的盘子,而我们要做的仅仅是写出这个递归,那么用代码来实现这个递归。是什么样子的呢,我们再看:

int  move(char x, char y)//当只有一个盘子时,使用这个函数
{
    
    
	printf(" %c>%c ", x, y);
}
int  hanoi(int n ,char a,char b,char c)
{
    
    
	if (n == 1) 
	{
    
    
		move(a, c);
	}
	else
	{
    
    
		hanoi(n - 1, a, c, b);//将A座上的n-1个盘子借助C座移向B座
		move(a, c);//将A座上最后一个盘子移向C座
		hanoi(n - 1, b, a, c);//将B座上的n-1个盘子借助A座移向C座
	}
}
int main()
{
    
    
	int n = 0;//假设有n个盘子
	printf("请问有多少个盘子");
	scanf("%d", &n);//输入想要输入的数字
	hanoi(n,'a','b','c');//我们需要一个函数来解决他
	//假设柱子名为a,b,c
	printf("交换了%d次");
	return 0;
}

运行结果
在这里插入图片描述

这样,我们就成功通过递归得到了汉诺塔问题的代码,

以上就是我对汉诺塔(Hanoi)的初步了解,如有不足,还请各位大佬批评指正,作为一个初学c语言的学徒,我会秉持着谦虚好学的态度,谢谢所有为我批评指正的大佬,并一一感谢!

猜你喜欢

转载自blog.csdn.net/nanmiao666/article/details/130324769