C语言汉诺塔的简单了解

 更新时间:2021年02月08日 14:24:10   作者:daener  
这篇文章主要给大家介绍了关于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----->%c\n", 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语言汉诺塔内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt实现数据导出到xls的示例代码

    Qt实现数据导出到xls的示例代码

    导入导出数据到csv由于语法简单,适用场景有限,于是本文将为大家介绍Qt如何实现导出数据到xls,感兴趣的小伙伴可以跟随小编一起试一试
    2022-01-01
  • DLL加载设置相对路径的方法

    DLL加载设置相对路径的方法

    这篇文章给大家介绍了DLL加载设置相对路径的方法,非常不错,具有一定的参考借鉴加载,需要的朋友参考下吧
    2018-08-08
  • C语言实现图的最短路径Floyd算法

    C语言实现图的最短路径Floyd算法

    这篇文章主要为大家详细介绍了C语言实现图的最短路径Floyd算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C++实现动态分配const对象实例

    C++实现动态分配const对象实例

    这篇文章主要介绍了C++实现动态分配const对象实例,包括了const对象的创建、删除及应用实例,需要的朋友可以参考下
    2014-10-10
  • C语言深入讲解链表的使用

    C语言深入讲解链表的使用

    当我们在写一段代码时,如果要频繁的在一块区域进行插入或者删除操作时,会发现用数组实现会比较复杂,这时候我们就要用另一种数据结构,链表来实现
    2022-05-05
  • Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>的解决方案

    Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>的

    如果大家也遇到下面这种问题,可能是没有include文件夹中没有bits/stdc++.h,这篇文章主要介绍了Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>的解决方案,感兴趣的朋友跟随小编一起看看吧
    2024-02-02
  • C++实现简单扫雷小游戏

    C++实现简单扫雷小游戏

    这篇文章主要为大家详细介绍了C++实现简单扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • 用C语言判断一个二叉树是否为另一个的子结构

    用C语言判断一个二叉树是否为另一个的子结构

    这篇文章主要介绍了用C语言判断一个二叉树是否为另一个的子结构,是数据结构学习当中的基础知识,需要的朋友可以参考下
    2015-08-08
  • C++中cin>>n的返回值

    C++中cin>>n的返回值

    这篇文章主要介绍了C++中cin>>n的返回值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Cocos2d-x触摸事件实例

    Cocos2d-x触摸事件实例

    这篇文章主要介绍了Cocos2d-x触摸事件实例,本文代码中包含大量注释来说明Cocos2d-x中的触摸事件使用示例,需要的朋友可以参考下
    2014-09-09

最新评论