不会还有人看了我的教程不会汉诺塔问题的解法吧!

Posted 小白白的可怜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不会还有人看了我的教程不会汉诺塔问题的解法吧!相关的知识,希望对你有一定的参考价值。

重述一遍汉诺塔问题,为了你更好地阅读

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

解法就是递归,理解三个盘子怎么移动就会这个递归是怎么来的了。

在这里插入图片描述
移动一个是不是可以直接移动。

要移动两个的话,就是先将上面一个移动到中转柱,将最后一个移动到目标柱,最后再将中转柱上的移动到目标柱上。

这是不是可以想成先将上面的两个盘子移动到中转柱上面,再将a柱上最下面那个盘子移动到目标柱c上面,最后再将那两个盘子从中转柱移动到目标柱上,要移动两个是不是就是上面的做法。

然后如果换成四个盘子,是不是就是将上面三个看成一个整体,移动到中转柱,再将a柱上的最后一个移动到目标柱,最后再将中转柱上的移动到目标柱上。要移动三个是不是上面那种做法,这就是递归。

这样看完就感觉很清楚的递归思路,再看一下代码,核心理解就是将最上面的,即除去最底层的看成一个整体,先将整体移动到中转柱,再将最底层那个移动到目标柱,最后再将整体从中转柱移动到目标柱。

代码用c++写的,会一点c也看得懂。

#include<iostream>
using namespace std;
int num = 0; //记录移动次数,因为是递归,不能在递归函数内用一个变量存放移动次数

class Solution
{
public:
	int hanNuo(int n,char a,char b ,char c);   //将 a移动到 c上
};
int Solution::hanNuo(int n, char a, char b, char c)
{
	if (n == 0)
		return 0;
	if (n == 1)
	{
		cout << "pull the plate to " << c << " from " << a << endl;  //只有一个盘就直接将它从a移动到目标柱c上
		num++;
	}
	else
	{
		hanNuo(n - 1, a, c, b);     //将n-1个盘从a移动到中转柱b上
		cout << "pull the plate to " << c << " from " << a << endl;  //将最后剩下的那个大盘移动到目标柱上作为底盘
		num++;
		hanNuo(n - 1, b, a, c);     //然后再将剩下的n-1个盘从中转柱b上移动到目标柱c上。
	} 
	return num;
}
int main()
{
	int n;

	cout << "input the number " << endl;
	cin >> n;
	Solution s1;
	cout << s1.hanNuo(n,'A','B','C') << endl;
}

在这里插入图片描述

以上是关于不会还有人看了我的教程不会汉诺塔问题的解法吧!的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1995 汉诺塔V

杭电oj1995——汉诺塔V(java实现)

汉诺塔问题的解法

用栈来求解汉诺塔问题

Python学习Python解决汉诺塔问题

JS经典面试题汉诺塔