汉诺塔问题

汉诺塔问题在C语言中一般采用递归法来写,假设有A、B、C三根棒,A棒放着若干个圆盘,将其移动到C棒上,中途可在B棒中暂时放置圆盘。

  

分析:

(1) 如果只有一个圆盘,则把该圆盘从A棒移动到C棒

(2) 如果圆盘数量n>1,移动圆盘的过程可分为如上图
第一步: 将A棒上的n-1个圆盘移动到B棒上。
第二步: 将A棒上的一个圆盘移动到C棒上。
第三步: 将B棒上的n-1个圆盘移动到C棒上。

完成目标:将n个圆盘从A搬运到C,求需要移动多少次完成?

约束条件:搬运的过程中每次只能移动一个圆盘,且不能出现大的圆盘在小的圆盘之上。

 

#include<stdio.h>
#include<string.h>
//函数声明
void move(char x, char y);
void hannuota(int n, char a, char b, char c)
{
	if (n == 1)
		move(a, c);
	else
	{
		hannuota(n - 1, a, c, b);        //将n-1个圆盘转移到B棒上,C做转移棒
		move(a, c);                     //再把A棒上的圆盘转移到C上
		hannuota(n - 1, b, a, c);      //把B棒上n-1个圆盘移到C上
	}
}

void move(char x,char y)
{
	printf("%c-->%c\n", x,y);
}

int main()
{
	int n;
	printf("input your number!\n");
	scanf_s("%d", &n);
	hannuota(n, 'A', 'B', 'C');      //A B C代表三个棒
	return 0;
}

如果n=3

运行结果:

A-->C    最小的到C
A-->B    第二层的到B
C-->B    最小的到第二小的上面
A-->C    最大的到C
B-->A    最小的到A
B-->C    第二小的到C
A-->C    最小的到C

与上面的动态图应该是一致的。

这是我第一次写博客,写的不好请见谅,写的是C语言中经典的递归问题。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值