汉诺塔问题

本文介绍了汉诺塔问题的解决方案,通过递归算法分析了将n个圆盘从A柱移至C柱的过程,指出移动次数为2^n-1,并提供了C语言代码实现。
摘要由CSDN通过智能技术生成

目录

1.问题概述

2.次数分析

3.算法分析(递归算法)

4.代码实现


1.问题概述

 如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数和步骤。

2.次数分析

(1)n == 1

             第1次  1号盘  A---->C       sum = 1 次

   (2)  n == 2

             第1次  1号盘  A---->B

             第2次  2号盘  A---->C

             第3次  1号盘  B---->C        sum = 3 次

(3)n == 3

        第1次  1号盘  A---->C

        第2次  2号盘  A---->B

        第3次  1号盘  C---->B

        第4次  3号盘  A---->C

        第5次  1号盘  B---->A

        第6次  2号盘  B---->C

        第7次  1号盘  A---->C        sum = 7 

不难发现规律:1个圆盘的次数 2的1次方减1

       2个圆盘的次数 2的2次方减1

                         3个圆盘的次数 2的3次方减1

                         。  。   。    。   。 

                         n个圆盘的次数 2的n次方减1

 故:移动次数为:2^n - 1

3.算法分析(递归算法)

(1)     把n-1个盘子由A 移到 B;

(2)     把第n个盘子由 A移到 C;

(3)     把n-1个盘子由B 移到 C;

4.代码实现

#include<stdio.h>
/*
pos1:起始位置
pos2:中专位置
pos3:目的位置
*/
int number = 0;
void move(char pos1, char pos2)
{
	printf("%c->%c\n", pos1, pos2);
	number++;
}
void Hanio(int n, char pos1, char pos2, char pos3)
{
	if (n == 1)
	{
		move(pos1, pos3);
	}
	else
	{
		Hanio(n - 1, pos1, pos3, pos2);
		move(pos1, pos3);
		Hanio(n - 1, pos2, pos1, pos3);
	}
}
int main()
{
	printf("具体步骤为:\n");
	Hanio(3, 'A', 'B', 'C');
	printf("移动的总次数为:%d", number);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值