汉诺塔(Tower of Hanoi)--------递归思路

汉诺塔问题简介:

有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移到柱子C上,并且每次移动,同一根柱子上都只能是大盘子在下,小盘子在上,请问至少需要多少次移动?

汉诺塔问题分析:

1.     若只有1个圆盘,就只需要移动 1 次,即 A → C;

2.     若有两个圆盘,则需要移动 3 次,即 A→B,A→C,B→C;

汉诺塔(Tower of Hanoi)--------递归思路_第1张图片

 3.    若有三个圆盘,则需要移动 7 次,即 A→ C,A→ B,C→ B,A→ C,B→ A,B→ C,A→ C

汉诺塔(Tower of Hanoi)--------递归思路_第2张图片

依此类推.......

汉诺塔问题的递归思路:

将 n 个圆盘分为 n-1 (即除最低层的圆盘)与 1 (即最底层的圆盘),将n-1个圆盘移动到中转位置,将1移动到目的位置,再将 n-1 分为 (n-1)- 1 与 1,将(n-1)- 1 移动到中转位置,将1移动到目的位置,依次类推......

代码如下:

#include
//打印每一步的操作
void move(char a, char b)
{
	printf(" %c -> %c ", a, b);
}
//n:有几个盘子
//a:起始位置
//b:中转位置
//c:目的位置
void hbt(int n, char a, char b, char c)
{
	if (n == 1)
		move(a, c);
	else//n>=2时
	{
		hbt(n - 1, a, c, b);
        //此时n-1的起始位置是a,中转位置是c,目的位置是b
		move(a, c);
        //将 1 从起始位置 a 移动到目的位置 c
		hbt(n - 1, b, a, c);
        //将 n-1 从起始位置 b,通过中转位置a,移动到目的位置 c
	}

}
int main()
{
	hbt(3, 'A', 'B', 'C');
    //3就代表有3个盘子,可修改
	return 0;
}

 图示如下:

汉诺塔(Tower of Hanoi)--------递归思路_第3张图片

 注意:这里的起始位置,中转位置和目的位置是相对的,最终是要将圆盘从A移到C!!!!!!

你可能感兴趣的:(算法,c语言)