【C++算法】汉诺塔问题

问题        

        汉诺塔编程,设 a,b,c 是 3 个塔座。开始时,在塔座 a 上有⼀叠共 n 个圆 盘,这些圆盘⾃下⽽上,由⼤到⼩地叠在⼀起。各圆盘从⼩到⼤编号为 1,2,…,n, 现要求将塔座 a 上的这⼀叠圆盘移到塔座 b 上,并仍按同样顺序叠置

分析

        汉诺塔是非常经典的递归问题,我们先考虑只有三个盘子的情况,现在有ABC三个柱子,A上有三个盘子,我们要把A上的三个盘子移动到B上,那么就可以先把A上的一个盘子移动到B上,再把A上的一个盘子移动到C上,然后把B上的一个盘子移动到C上,然后把A上的一个盘子移动到B上,然后把C上的一个盘子移动到A上,然后把C上的一个盘子移动到B上,然后把A上的一个盘子移动到B上。这样就完成了移动。

        我们仔细观察一下移动过程,其实就是把A上的两个盘子移动到C上,然后A就只剩一个盘子了,可以直接移动到B上,然后再把C上的一个盘子移动到A上,C就只剩一个盘子了,可以直接移动到B上,然后再把A上剩下的那个移动过去就可以了。

        因此,我们扩展到n个盘子的情况,汉诺塔其实就是三个步骤,先把A上的n-1个移动到C上,然后把A上的最后一个移动到B上,然后再把C上的n-1个移动到A上,然后再递归移动那n-1个,让那n-1个的n-1个先移动到C上,再把剩的一个移动到B上,终止递归的条件是只有一个盘子的时候,就可以直接移动了。也就是递归到最后只剩下有两个盘子要移动到B或C的时候,那就是先把上面那个移动到C,再把下面那个移动到B,再把C上的盘子移动到B,这时候上面和下面都只有一个盘子,可以直接移动,不需要递归考虑一个盘子要怎么移动。

代码及运行结果

#include 
using namespace std;

void Hanio_Step(int n, char A, char C, char B) //函数效果是将n个盘子从a借助c移动到b上 
{
	if (1 == n) //终止条件是只有一个盘子的时候就直接移动就行
		printf("%c->%c\n", A, B);
	else //如果不止有一个盘子 
	{
		Hanio_Step(n - 1, A, B, C); //a上的盘子经过b移动到c上 
		printf("%c->%c\n", A, B); //然后把a上剩下的那一个移动到b上 
		Hanio_Step(n - 1, C, A, B); //然后再把c上的盘子经过a移动到b上 
	}
}
int main()
{
	int n = 0;
	cin >> n;  //A柱子上盘子的个数 
	Hanio_Step(n, 'A', 'C', 'B');
	return 0;
}

【C++算法】汉诺塔问题_第1张图片

汉诺塔如何移动,我们拿把n个盘子从a移动到c来说,其实就是先将a上的n-1个经过c移动到b上,然后把a上剩下的那一个移动到c上,然后再把b上的n-1个经过a移动到c上。所以递归函数也非常好写,只需要一个含有三个形参abc的函数,表示从a经过b移动到c,递归过程就只要先把n-1个通过递归移动到中转站b上,然后把最后剩下的一个移动到c上,然后再递归考虑把n-1个从b上经过a移动到c上就可以了。

你可能感兴趣的:(C++算法题,c++,算法,开发语言,c语言)