0
点赞
收藏
分享

微信扫一扫

Anaconda 相关命令使用学习笔记

前言

今天我们学习一个老经典的问题-----汉诺塔问题,可能在学习编程之前我们就听说过这个问题,那这里我们如何去通过编程的方式去解决这么一个问题呢?下面接着看。

在这里插入图片描述

汉诺塔问题

问题描述

下面展示一个三个的汉诺塔解决过程,如下图所示:
在这里插入图片描述
在这里插入图片描述
其他情况:
在这里插入图片描述

解决思路(分治算法)

在汉诺塔问题中,当圆盘个数不大于 3 时,多数人都可以轻松想到移动方案,随着圆盘数量的增多,汉诺塔问题会越来越难。也就是说,圆盘的个数直接决定了汉诺塔问题的难度,解决这样的问题可以尝试用分治算法,将移动多个圆盘的问题分解成多个移动少量圆盘的小问题,这些小问题很容易解决,从而可以找到整个问题的解决方案。

代码实现(C语言)

#include<stdio.h>

//打印移动的过程
void move(char x, char y) {
	printf("%c--->%c\n", x, y);
}

//递归移动
void generate(int n,char a, char b, char c) {
	if (n == 0)
		return;	//如果移动完成了就返回,开始递归运算

	//第一个过程,先把A柱子上的前n-1个汉诺塔移到B柱子上,再把最底下的那个汉诺塔移动到C上
	
	//此时a是起始柱子,c是目标柱,b是辅助柱		a--->c
	generate(n - 1, a, c, b);
	move(a, c);

	//第二个过程,当第一个过程完成了之后,就要把B柱子上的n-1个汉诺塔移回A柱子,这就是整体一个分支过程
	//此时b是起始柱,a是目标柱,c是辅助柱		b--->a
	generate(n - 1, b, a, c);
}

int main() {
	int n;
	printf("输入汉诺塔个数:");
	scanf("%d", &n);
	generate(n, 'A', 'B', 'C');
}

运行结果如下:
在这里插入图片描述

好了,以上就是本期的全部内容了,这个汉诺塔是不是很有意思呢?你学会了吗?
分享一张壁纸:在这里插入图片描述

举报

相关推荐

0 条评论