PKU软微算法题总结2——汉诺塔

2.Q.汉诺塔模型(口述汉诺塔代码)

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说。有三根柱子ABC,在柱子A上从下往上按照大小顺序摞着N片圆盘。要求把圆盘从下面开始按大小顺序重新摆放在C柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

找规律:

1片 2片 3片 4片 n片
1次 3种 7种 15种(2*7+1) 2*f(n-1)+1

证明:
验证n=1,n=2成立;
设n=k-1成立;
证n=k:
每次都分为第k个(最大的一片),和前k-1个。
1、先把A柱上面的(k-1)个圆盘移到B柱。用了f(k-1)次。
2、再把A柱上剩下的那个最大的圆盘移到C柱。用了1次。
3、最后把B柱上的(N-1)圆盘移到C柱。用了f(k-1)次。
∴f(k)=2*f(k-1)+1

代码实现:
1.递归计算移动次数 时间复杂度:O(n) ,空间复杂度:O(n)

#include<iostream>
using namespace std;
int hanoi(int n)
{
	if (n == 1)
		return 1;
	else
		return 2 * hanoi(n - 1) + 1;
}
int main()
{
	cout<<hanoi(4)<<endl;
	return 0;
}

2.递归显示移动方法 时间复杂度:O(2n)

#include <iostream>
#include<cstdio>
using namespace std;

void hanoi(int n, char a, char b, char c)//从a搬到c,b作辅助
{
	if (n == 1)
		cout << a << "->" << c<<endl;
	else
	{
		hanoi(n - 1, a, c, b);//先把前n-1个,从a搬到b,c作辅助
		cout << a << "->" << c<<endl;//再把最后一个,从a搬到c
		hanoi(n - 1, b, a, c);//最后把前n-1个,从b搬到c,a作辅助
	}
}
int main()
{
	char a = 'A', b = 'B', c = 'C';
	hanoi(4, a, b, c);
	return 0;
}

两个算法结果:

在这里插入图片描述

发布了16 篇原创文章 · 获赞 3 · 访问量 309

猜你喜欢

转载自blog.csdn.net/bajiaoyu517/article/details/103832133