【C语言】汉诺塔问题的解决办法(附图)

1.游戏规则

汉诺塔(Hanoi)游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个盘子。游戏的目标:把A杆上的盘子全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上。操作过程中盘子可以置于A、B、C任一杆上。

根据汉诺塔游戏的介绍我们可以得出两条重要的规则:

1.一次只能移动一个盘子

2.在移动的过程中我们要保证三根杆上的盘子大盘在下,小盘在上(即由上到下从小到大排列)

2.思路解析

1.当只有一个盘子的时候,我们只需将这一个盘子移到最后一根柱子即可解决问题。

2.当有两个盘子的时候:

初始情况是这样的

依据规则中的:在移动过程中三根杆上都始终保持大盘在下,小盘在上。我们可以得出在解决问题前的一个步骤所展示的情况如下

3.当有三个盘子的时候,初始情况如下:

 依据规则,我们在将最大的盘子移动到 C 柱的时候,其他两个盘子的情况应该是是这样的:

 然后我们再将盘子按照规则依次移动使得三个盘子有序的放在 C 柱上

以此类推我们可以发现,假设有n个盘子,当最大的盘子移动到C柱上的时候,n-1个盘子都有序的放在B柱上,而第(n-1)个柱子要做的是将盘子通过A柱(中转柱),从B柱(初始柱)移动到C柱(最终柱),当移动完成后我们又会发现剩下(n-2)个盘子有序的放在B柱上。根据这个规律,我们可以写出代码

	Hanoi(n - 1, pos1, pos3, pos2);
	move(pos1, pos3);
	Hanoi(n - 1, pos2, pos1, pos3);

即我们先将(n-1)个盘子从初始柱A通过中转柱C移动到最终柱B后,将第n个盘子从A柱移动到C柱,然后再将(n-1)个柱子执行上述的指令即可解决问题。 

3.最终代码

我们首先定义一个函数来实现我们盘子移动的功能:

void move(char pos1, char pos2)
{
	printf("%c -> %c\t", pos1,pos2);
}

接着我们定义一个解决问题的函数:

void Hanoi(int n,char pos1, char pos2, char pos3)
{
	if (n == 1)
	{
		move(pos1, pos3);
	}
	else
	{
		Hanoi(n - 1, pos1, pos3, pos2);
		move(pos1, pos3);
		Hanoi(n - 1, pos2, pos1, pos3);
	}
}

最后我们通过主函数来实现他

int main()
{
	Hanoi(3,'A','B','C');
	return 0;
}

 完整代码如下:

#include<stdio.h>
void move(char pos1, char pos2)
{
	printf("%c -> %c\t", pos1,pos2);
}

void Hanoi(int n,char pos1, char pos2, char pos3)
{
	if (n == 1)
	{
		move(pos1, pos3);
	}
	else
	{
		Hanoi(n - 1, pos1, pos3, pos2);
		move(pos1, pos3);
		Hanoi(n - 1, pos2, pos1, pos3);
	}
}



int main()
{
	Hanoi(3,'A','B','C');
	return 0;
}

运行结果如下

 以上就是汉诺塔问题的解析和代码实现

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值