汉诺塔问题和其时间复杂度

数据结构课老师留的第一道作业题

啊啊

首先来看一下什么是汉诺塔问题

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

所以我们假设有A,B,C三根柱子,现在要把A柱子上的n个圆盘移动到C柱子上。我们可以先考虑A柱子上的n-1个圆盘,将他们先借用C柱子移动到B柱子上,假设用时T(n-1),然后我们把A柱子上剩下的哪一个圆盘直接移动到C柱子上,最后在将B柱子上n-1个圆盘通过A柱子移动到C柱子上,用时T(n-1)。我们假设移动n个圆盘用时T(n),则由推导显然有T(n)=2*T(n-1)+1。当问题缩减至A柱子上只有一个圆盘时,将它移动到C柱子耗时T(1) = 1,则根据上述推导可以得出汉诺塔问题递归算法的时间复杂度为O(2^n)。

代码实现(C++):

// 汉诺塔问题.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include<cstdio>
using namespace std;

long long step = 0;
void move(char a, char b)
{
	step++;
	printf_s("%c->%c\n", a, b);
}
void hanoi(int n, char a, char b, char c)//a代表起始柱,b代表借助柱,c代表目标柱
{
	if (n == 1)
		move(a, c);
	else
	{
		hanoi(n - 1, a, c, b);
		move(a, c);
		hanoi(n - 1, b, a, c);
	}
}
int main()
{
	int n;
	printf_s("input the quantity of the disks: ");
	cin >> n;
	hanoi(n, 'A', 'B', 'C');
	printf_s("Total steps: %lld", step);
}

运行结果如下:

猜你喜欢

转载自blog.csdn.net/weixin_41106545/article/details/83021729