# 汉洛塔问题的解决思路及其代码

汉洛塔问题的解决思路及其代码

问题描述:

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置n个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。# 汉洛塔问题的解决思路及其代码_第1张图片
分析:
如果要将n个圆盘按条件从A杆移到C杆,如果可以将n-1个圆盘移动到B杆,则可以将A杆中最大的圆盘移到C杆,那么我们就完成了一步,此后就可以不用考虑最大的盘,那么问题就变成了n-1个圆盘的问题了,依次类推,要想将n-1个圆盘移动到B杆,则需要将n-2个圆盘移动到C杆,要想将n-2个盘移动到C杆,则需要将n-3个盘移到B杆…
最后问题就变成了将一个圆盘移到B或C杆,然后就可以一步一步回推。
这个就像你要买冰箱,老板说你可以拿洗衣机来换,然后你去买洗衣机,老板说你可以拿空调来换,然后空调老板说你可以拿麻将桌来换,然后最后的老板说你可以拿一个鸡蛋来换,最后你拿着一个鸡蛋去一个一个换,最后得到了你想要的冰箱。至于你说为什么这么麻烦,别问,问就是没钱。
# 汉洛塔问题的解决思路及其代码_第2张图片
代码如下:

//使用递归方法
#include
void move(char a, char c)
{
     
	printf("%c->%c\n", a, c);//将步骤打印出来,可以自己验证是否满足条件
}
void MOVE(int n ,char a, char b, char c,int* p)
{
     
	if (n == 1)
	{
     
		move(a, c);
		(*p)++;
	}
	else
	{
     
		MOVE(n - 1, a, c, b, p);//每递归一次问题就简化一次,那一堆圆盘的目标杆
		//就得在AB之间变一次此处参数定义为a,c,b就可实现这一点
		move(a, c);//此时对应的z(等于n-k)应该为2,即将两个圆盘从A移到C或
		//从A移到B(由n决定)上一步已经将A杆中最上方圆盘移到从B(假设为B),
		//此处将A中第二个盘移到C
		(*p)++;
		MOVE(n - 1, b, a, c, p);//此处再将B上圆盘移到C,则完成了将两个圆盘移到C(也可能是B),就相当与我们买到了鸡蛋,可以一步一步换冰箱了
	}
	
}
int main()
{
     
	int n, num = 0;
	int* p = #
	printf("请输入圆盘个数:");
	scanf("%d", &n);
	//用A B C代表三个杆
	MOVE(n , 'A', 'B', 'C',p);
	printf("共移动%d次\n", num);
	return 0;
}
好了,以上就是我对这个问题的理解,如有纰漏,请各位大神指正,三克油!

你可能感兴趣的:(算法,c语言)