首页 > 其他分享 >c语言实现【汉诺塔问题】

c语言实现【汉诺塔问题】

时间:2022-11-21 17:02:44浏览次数:68  
标签:圆盘 语言 han 实现 char int 汉诺塔 移动

【汉诺塔问题】c语言实现

1.问题描述

汉诺塔问题是指:
一块板上固定三个木杆: A、B、C。A 赶上套有若干个大小不等的圆盘,按照大的在下、小的在上的顺序排列,要把这些圆盘从 A 移动到 C 上,每次只能移动一个圆盘,移动过程可以借助 B 。但在任何时候,任何木杆上的圆盘都必须保持大盘在下,小盘在上。

从键盘输入需移动的圆盘个数n,打印出移动的过程。

2.问题分析

模拟其实际操作过程,可以发现:

  1. 当只移动一个圆盘时,直接将圆盘从 A 移动到 C 。

  2. 若移动的圆盘为 n(n>1),则分成几步走:

step1. 把 (n-1) 个圆盘从 A 移动到 B (借助 C );
step2. A 上的最后一个圆盘移动到 C ;
step3. B 上的 (n-1) 个圆盘移动到 C (借助 A )。

因此,解决汉诺塔问题可设计一个递归函数,上述模拟过程即为递归体。当n最后为1时,即可完成整个移动过程。

3.C语言代码实现及测试

int main()
{
	void han(int,char,char,char);
	int n;
	printf("Please input the number of the disks:>");
	scanf("%d", &n);
	printf("\n");
	
	han(n,'A','B','C');
	return 0;
}

void han(int n, char a, char b, char c)
{
	void move(char,int,char);
	if (n == 1)
		move(a,1,c);
	else
	{
		han(n-1,a,c,b);
		move(a,n,c);
		han(n-1,b,a,c);
	}
}

void move(char from, int n, char to)
{
	static int count = 1;
	printf("%2d:%3d %c -> %c\n", count,n,from,to);
	if (count%3 == 0)
		printf("\n");
	count++;
}

/*测试
Please input the number of the disks:>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
*/

4.参考

1.用C语言实现汉诺塔

2.动图-汉诺塔问题

标签:圆盘,语言,han,实现,char,int,汉诺塔,移动
From: https://www.cnblogs.com/ljdsbfj/p/16911915.html

相关文章

  • WMS系统中使用脚本实现可定制化
    WMS系统是一种需要高度定制化的应用系统,需要在系统的产品化与定制化之间寻找一个平衡点。部分使用脚本语言可以作为一个选项。本文章并不准备使用实际的代码来展示相应的......
  • go 语言 http包详解
      首先,熟悉http协议的都知道,http协议是基于TCP实现的。 http服务器的工作方式大概就是监听socket端口,接受连接,获取到请求,处理请求,返回响应。 所以,对应的会有几个部分......
  • Java双向链表实现队列
    将双向链表做简单的改造,即可实现一个FIFO(FirstInputFirstOut)队列,该队列只在头节点出队,尾节点入队。一般来说定义节点类只需一个后驱节点next即可。这里保留pre节......
  • JSP利用AJAX实现页面即时校验验证码
    在JSP页面实现验证码校验文章中当时是使用的Servlet类来进行的验证码校验,但是这种方式并不能即时校验,在正常情况下都是直接在用户输入之后就进行校验,这样对用户来说很方便......
  • 关于一个类可以同时实现单例和实例化调用其类中方法
    近期再写代码的过程中,发现好多大哥习惯于再调用dbhelp或者别的类库的时候,喜欢直接使用类库.方法名去调用,但是还有一些新手更喜欢去实例化调用,对于以上的两种写法,做了一个......
  • 利用内网穿透,实现公网访问内网
    由于IPV4地址资源的稀缺性,运营商分配给到用户的,基本都是内网IP。因此,公网电脑想要访问内网电脑时,常常会遇到没有公网IP,无法直接与内网电脑进行通信。而在没有公网IP的情况......
  • 滑动实现
    滚动:盒子:固定高度overflow:auto;------------------容器组件:scroll-view+固定高度(wxss高度)scroll-x:横向滚动scroll-y:纵向滚动------------------使用:<scroll......
  • 用NetCore + ReactJS 实现一个前后端分离的网站 (2) 用依赖注入实现控制反转
    用NetCore+ReactJS实现一个前后端分离的网站(2)用依赖注入实现控制反转1.控制反转刚接触控制反转的时候,颇有些挠头,它怎么就反转了呢。稍微熟悉了之后,才理解了一些......
  • 多种语言---安全的文件操作示例
    文件校验方式读取或者写入文件时必须文件进行校验,防止软连接攻击或者提权攻击,如果校验后再打开文件操作,很容易被构造条件竞争攻击。因此较安全的方式是先将文件打开,然后再......
  • antd Cascader实现多选功能
    antd中的组件cascader用于联级选择,但是只支持单选,在项目过程中经常会遇到多选的情况。这边将多选情况进行总结,以及附上实现代码。antd实现的单选功能如下:https://3x.ant.......