#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>/*柔性数组*/
typedef struct _soft_array{int len;int array[];
}soft_array;/*汉诺塔结构体*/
typedef struct _hannuo{soft_array *p_data;char name;
}hannuo;hannuo * han_a = NULL;
hannuo * han_b = NULL;
hannuo * han_c = NULL;void hannoiii(int n,hannuo * a,hannuo * b,hannuo * c);
void moveiii (int n,hannuo * a,hannuo * c);int count = 0;
int total;void printf_han_data(hannuo * han)
{int i = 0;int j = 0;int tmp = 0;/*获取长度*/int n = han->p_data->len;soft_array *p_array = NULL;/*申请内存,赋值数据*/ p_array = (soft_array*)malloc(sizeof(soft_array)+sizeof(int)*n);memcpy(p_array,han->p_data,sizeof(soft_array)+sizeof(int)*n); printf("%c: ",han->name);/*排序*/for(i = 0;i<n;i++){for(j=0;j<n-1;j++){if(p_array->array[j] > p_array->array[j+1]){tmp = p_array->array[j];p_array->array[j] = p_array->array[j+1];p_array->array[j+1] = tmp;}}}/*输出汉诺塔的数据*/for(i = 0;i<n;i++){if(i != n-1)printf("%d-",p_array->array[i]);elseprintf("%d",p_array->array[i]);}/*释放内存*/if(p_array != NULL)free(p_array);printf("n");
}int main()
{int i = 0;int n = 0;scanf(" %d",&n);total = n;/*定义三个汉诺塔节点*/han_a = (hannuo *)malloc(sizeof(hannuo));han_a->name = 'A';han_a->p_data = (soft_array*)malloc(sizeof(soft_array)+sizeof(int)*n);han_a->p_data->len = n;/*数据原来在第一根柱子上*/for(i = 0;i<n;i++){han_a->p_data->array[i] = i+1;}printf_han_data(han_a);/*初始化第二根柱子*/han_b = (hannuo *)malloc(sizeof(hannuo));han_b->name = 'B';han_b->p_data = (soft_array*)malloc(sizeof(soft_array)+sizeof(int)*n);memset(han_b->p_data,0,sizeof(soft_array)+sizeof(int)*n);han_b->p_data->len = n;printf_han_data(han_b);/*初始化第三根柱子*/han_c = (hannuo *)malloc(sizeof(hannuo));han_c->name = 'C';han_c->p_data = (soft_array*)malloc(sizeof(soft_array)+sizeof(int)*n);memset(han_c->p_data,0,sizeof(soft_array)+sizeof(int)*n);han_c->p_data->len = n;printf_han_data(han_c);printf("初始化结束------------------------n");hannoiii(n,han_a,han_b,han_c);/*清内存*/if(han_a != NULL)free(han_a);if(han_b != NULL)free(han_b);if(han_c != NULL)free(han_c);if(han_a->p_data != NULL)free(han_a->p_data);if(han_b->p_data != NULL)free(han_b->p_data);      if(han_c->p_data != NULL)free(han_c->p_data);scanf(" %d",&n);printf("Exiting main ....n");return 0;
}void hannoiii(int n,hannuo * a,hannuo * b,hannuo * c)
{if(n == 1){moveiii(n, a, c);        /*把 n 从 a 移动到 c 上*/printf_han_data(han_a);printf_han_data(han_b);printf_han_data(han_c);printf("------------------------n");}else{hannoiii(n - 1, a, c, b);/*把 n-1 从 a 柱子放到 b 柱子上面*/moveiii(n, a, c);        /*把 n 从 a 移动到 c 上*/printf_han_data(han_a);printf_han_data(han_b);printf_han_data(han_c);printf("------------------------n");hannoiii(n - 1, b, a, c);/*把n - 1 通过 a 的辅助作用 从 b 移动到 c 上*/}
}void moveiii (int n,hannuo * a,hannuo * c)
{int tmp = a->p_data->array[n-1];a->p_data->array[n-1] = 0;c->p_data->array[n-1] = tmp;count++;printf("第%d次移动 Move %d: 从 %c 位置 移动到 %c !n",count,tmp,a->name,c->name);
}

如果是数字很大的话,滚动就非常频繁了,我录个视频给大家看看。

https://www.zhihu.com/video/1186324583287779328

C 语言,你真的懂递归了吗?​mp.weixin.qq.com

汉诺塔c++_C语言,递归解决汉诺塔问题相关推荐

  1. c语言递归汉诺塔次数,c语言递归解决汉诺塔参数变化的疑惑

    c语言递归解决汉诺塔参数变化的疑惑 答案:3  信息版本:手机版 解决时间 2020-04-05 14:20 已解决 2020-04-05 10:49 #include void main() {vo ...

  2. c语言递归解决汉诺塔问题

    c语言递归解决汉诺塔问题 参考文章: (1)c语言递归解决汉诺塔问题 (2)https://www.cnblogs.com/didiaoxiaoguai/p/6686407.html 备忘一下.

  3. 汉塔克问题(C语言递归)

    汉塔克问题(C语言递归) 操作步骤 代码 操作步骤 当n为1时直接将盘子从第一个柱子移动到第三个柱子. 当 n>1时,先借助第三个柱子将n-1个盘子移动到第二个柱子,然后将第n个盘子从第一个柱子 ...

  4. 【汉诺塔】C语言递归解法,深层次地带你理解汉诺塔公式

    目录 汉诺塔公式 汉诺塔问题在数学层面的公式: C语言递归公式 两层汉诺塔 三层汉诺塔 递归问题可谓是学习C语言以来的第一个拦路虎,而汉诺塔问题更是递归中对新手很不友好的一道经典题,我们接下来从公式角 ...

  5. C语言 递归实现汉诺塔问题 【图文讲解、简单易懂】

    汉诺塔问题是我们在学习函数递归时常遇见的一类问题,那么如何用简单易懂的思路来解决汉诺塔问题呢?下面我会为大家进行讲解 目录 汉诺塔是什么? 汉诺塔的来源 用C语言实现汉诺塔 汉诺塔问题分析思路: 用代 ...

  6. C++非递归解决汉诺塔问题

    汉诺塔问题简述:将塔A上的n个大小不一的盘子借由塔B全部移动到塔C上,且在过程中不能将大盘子放在小盘子上.                  目录 1.算法: 2.具体效果: 3.SeqStack.c ...

  7. 2.2基本算法之递归和自调用函数_用栈算法递归解决汉诺塔问题

    今天博主收一下线性表的尾,最近我们要学习的内容是栈和队列板块,栈和队列板块分为两讲,第一讲也就是今天我们主要学习栈的相关知识,包括栈的定义.栈的顺序表示及实现,栈的链式表示,栈的应用举例,以及栈递归实 ...

  8. 一句话解决汉诺塔(C语言递归)每日一练

    看题目: 编写一个程序,对于一个有n个盘子的汉诺塔,列举将这n个盘子从柱子 A 移动到柱子 C 需要的所有移动步骤> 一句话时间: 规律是二的n次方减一,步骤思想是把除了最大的盘子的所有盘子借助 ...

  9. c语言递归求塔移动次数,c语言递归调用汉诺塔

    递归算法的出发点不是由初始条件出发,而是把出发点放在求解的目标上,从所求的未知项出发逐次调用本身的求解过程,直到递归的边界(即初始条件). 汉诺塔问题的重点是分析移动的规则,找到规律和边界条件. 若需 ...

  10. ICS计算系统概论LC3汇编实验Lab5—中断、递归解决汉诺塔问题

    Lab Purpose 完成用户程序的编写. 编写下面描述的键盘中断服务例程. condition: 用户程序: 汉诺塔的参数,记录为N,将用xFFFF初始化并存储在X3FFF内存中. 您的用户程序从 ...

最新文章

  1. 2021-08-05 Ubuntu18.04安装ROS出现的一些问题
  2. 缩略图信息提取工具vinetto
  3. CSS引入CSS文件不生效 搞得很恼火
  4. junit4和junit5_JUnit5 TestSuite替代
  5. 讲的真透彻!还有人不知道什么是AndroidX的吗?已拿offer入职
  6. android 学习链接大集合
  7. 探索比特币源码3-熟悉RPC接口
  8. 开工了,为自己做的软件。先做些控件。
  9. iptables 执行清除命令 iptables -F 要非常小心的
  10. 4代hiv检测50元_50元的乙肝两对半体检,值得吗?检测前,5种行为不要做
  11. 软件测试中不需要测试的八件事
  12. php 网贷 源码,thinkphp仿百度钱包网贷借款源码
  13. 大学算法分析与设计复习总结
  14. 区块链中国专利分析报告.20180309
  15. 反向代理服务器域名解析
  16. C. Minimum Ties
  17. 我国第三方支付的发展及监管现状
  18. oracle 根据符号分列,oracle 树结构数据层次分列显示
  19. 【C++系列15】c++的正无穷和负无穷
  20. 如何编写功能测试报告

热门文章

  1. js字符串编码和unicode编码互转
  2. GNU make manual 翻译(四十六)
  3. php+mysql事务处理例子详细分析实例
  4. Hadoop工具让数据仓库迁移更轻松
  5. 《深入理解Hadoop(原书第2版)》——3.4第一个Hadoop程序
  6. for_else,break——python小练
  7. AndroidStudio编译引入JsonObject
  8. 使用计算机音箱进行音乐播放的过程,插卡音箱音乐播放顺序调整及歌单式1
  9. BIO、NIO、AIO的简单个人理解,同步异步和阻塞非阻塞的简单理解
  10. Java 后端MD5加密