我是靠谱客的博主 有魅力秋天,最近开发中收集的这篇文章主要介绍C语言汉诺塔的简单了解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

汉诺塔详解

以4层为例

以下为我的拙见,还希望大佬雅正

要把汉诺塔移动到c 需要把1,2,3层移到b 把4移动到c 在吧123移动到b

但是一次只能动一块 所以我们目前要做的就是把上面三块移动到b

那就需要把1 2移动到c

由此我们可以推出要把1,2移动到c,只需要把1移动到b

这里我们发现有很多重复的自相似动作

我们就可以设计递归 递归需要1,递归体 2 出口。

递归体

移动n-1个盘子和1个盘子和n个盘子过程都是相似的

但是每次放入的杆子不一样。

出口

n=1时只剩一个盘子,直接移动到c即可

hanoi(n ,A , B , C)

N 移动数量

A 出发地

B 借助地

C 终点

这个函数的意思就是有n个盘子从A出发借助B来到C

现在有n层汉诺塔 就需要把上面n-1层移动到B

hanoi(n-1,A,C,B)

这个函数就是我们要把n-1个盘子从A借助C移动到B

move(a,c)现在不需要再借助了 可以直接从a移动到c

接下来我们就要借助A吧剩下n-1个盘子移动到C了

hanoi(n-1,B,A,C)即可完成

递归出口

n<=1

在这里插入代码片
```// 汉诺塔问题
//输出移动的步骤 
#include <stdio.h>
//记录步数 
int i = 1;
//n 第几号盘移动, from 移动塔 to 目标塔 
void move(int n, char from, char to) {
 printf("第%d次移动第%d号盘: %c----->%cn", i++, n, from, to);
}

void hanoi(int n, char from, char mid, char to) {
 if (n == 1) {
  move(n, from, to);//只有一个盘子是直接将初塔上的盘子移动到目的地
 }//函数出口
 else {
  hanoi(n - 1, from, to, mid);//先将初始塔的前n-1个盘子借助目的塔移动到借用塔上
  move(n, from, to);  //将剩下的一个盘子移动到目的塔上
  hanoi(n - 1, mid, from, to);//最后将借用塔上的n-1个盘子移动到目的塔上
 }
}

int main() {
 printf("请输入盘子的个数:n");
 int n;
 scanf_s("%d", &n);
 char x = 'A', y = 'B', z = 'C';
 printf("盘子移动情况如下:n");
 hanoi(n, x, y, z);
 return 0;
}

总结

到此这篇关于C语言汉诺塔的文章就介绍到这了,更多相关C语言汉诺塔内容请搜索靠谱客以前的文章或继续浏览下面的相关文章希望大家以后多多支持靠谱客!

最后

以上就是有魅力秋天为你收集整理的C语言汉诺塔的简单了解的全部内容,希望文章能够帮你解决C语言汉诺塔的简单了解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(97)

评论列表共有 0 条评论

立即
投稿
返回
顶部