借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”),并保证每个移动符合汉诺塔问题的要求。

输入格式:

输入为一个正整数N,即起始柱上的盘数。

输出格式:

每个操作(移动)占一行,按柱1 -> 柱2的格式输出。

输入样例:

3

输出样例:

a -> c
a -> b
c -> b
a -> c
b -> a
b -> c
a -> c

理解一下首先我写了下递归的情况,这里讲下思路:

其实最终移盘子可以看做是:

1.将0到n-1个盘子借助c从a移到b;

2.将第n个盘子借助b从a移动到c;

3.最后把0到n-1个盘子借助a移动到c;

#include <stdio.h>#include <stdlib.h>void move(char A, char C){printf("%c -> %c\n",A,C);}void hanoi(int n, char A, char B, char C);int main(){int n;scanf("%d",&n);char A = 'a', B = 'b', C = 'c';hanoi(n,A,B,C);return 0;}void hanoi( int n, char A, char B, char C ){if(n == 1){move(A,C);}else{hanoi(n-1,A,C,B);move(A,C);hanoi(n-1,B,A,C);}}

这个憨批题目也不会检测你递归是错的,难点在非递归,这里得用堆栈的思想;

借用一下图https://blog.csdn.net/royzdr/article/details/79032032 出处是这里;

#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#define STACKSIZE 100typedef struct{char a;char b;char c;int n;}ElementType;typedef struct node *PtrToSnode;struct node{ElementType *data;int top;int maxsize;};typedef PtrToSnode mystack;mystack creatstack(int maxsize){mystack ms = (mystack)malloc(sizeof(struct node));ms->data = (ElementType *)malloc(maxsize * sizeof(ElementType));ms->top = -1;ms->maxsize = maxsize;return ms;}void pushdata( mystack ms, ElementType x ){if( ms->top == ms->maxsize - 1){printf("Stack is Full!\n");}else{ms->data[++(ms->top)] = x;}}ElementType popdata( mystack ms ){if(ms->top == -1){printf("Stack is Empty!\n");}else{return ms->data[ms->top--];}}void hanoi( int n ){mystack ms = creatstack(STACKSIZE);ElementType tmp,topush;tmp.a = 'a';tmp.b = 'b';tmp.c = 'c';tmp.n = n;pushdata(ms, tmp);while(ms->top != -1){tmp = popdata(ms);if(tmp.n == 1){printf("%c -> %c\n",tmp.a,tmp.c);}else{topush.a = tmp.b;topush.b = tmp.a;topush.c = tmp.c;topush.n = tmp.n - 1;pushdata(ms, topush);topush.a = tmp.a;topush.b = tmp.b;topush.c = tmp.c;topush.n = 1;pushdata(ms, topush);topush.a = tmp.a;topush.b = tmp.c;topush.c = tmp.b;topush.n = tmp.n-1;pushdata(ms, topush);}}}int main(){int n;scanf("%d",&n);hanoi(n);return 0;}

这里用到了结构体,堆栈以及结构数组,这里有一个点容易遗忘,当用malloc为指针类型变量申请空间的时候,格式是(ElementType *)malloc(n * sizeof(ElementType));这里的ElementType是你申请的变量的名称,本题这里是一个结构体数组,所以申请的是一个指向结构体的指针的空间,data数组存储的是一堆指针,其余的都是小操作,花了很多时间这道题,做了两次以后还得好好温习!!!

奥力给!

奥力给!

奥力给!

习题3.10 汉诺塔的非递归实现 (25分)相关推荐

  1. 7-5 汉诺塔的非递归实现 (25 分)

    7-5 汉诺塔的非递归实现 (25 分) 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为"a")通过借助柱(标记为"b ...

  2. 7-107 汉诺塔的非递归实现 (25 分)

    7-107 汉诺塔的非递归实现 (25 分) 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为"a")通过借助柱(标记为" ...

  3. 7-17 汉诺塔的非递归实现 (25 分)(思路分析)

    一:题目 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为"a")通过借助柱(标记为"b")移动到目标柱(标记 ...

  4. PTA 汉诺塔的非递归实现

    PTA 汉诺塔的非递归实现 7-11 汉诺塔的非递归实现 (25分) 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为"a")通过 ...

  5. 汉诺塔的非递归实现(借助堆栈模拟递归)

    汉诺塔的非递归实现 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n,a,b,c).即将n个盘子从起始柱(标记为"a")通过借助柱(标记为"b")移动到目标杜( ...

  6. 汉诺塔python非递归实现,[Python3 练习] 006 汉诺塔2 非递归解法

    题目:汉诺塔 II 接上一篇 [Python3 练习] 005 汉诺塔1 递归解法 这次不使用递归 不限定层数 (1) 解决方式 利用"二进制" (2) 具体说明 统一起见 我把左 ...

  7. 汉诺塔问题的递归和非递归算法

    汉诺塔问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上 ...

  8. python堆栈汉诺塔非递归_汉诺塔问题的递归解法和非递归解法(python语言实现)...

    汉诺塔问题的非递归解法(python语言类解法) #!/usr/bin/env python #coding:utf-8 import sys import time reload(sys) sys. ...

  9. 汉诺塔问题的递归求解

    汉诺塔问题的递归求解 汉诺塔 解题思路 具体实现 汉诺塔 汉诺塔 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱 ...

最新文章

  1. python提取网页数据
  2. hdu 2275 Kiki Little Kiki 1
  3. 电脑技巧:这样检查电脑后终于知道为什么越用越卡
  4. java 输入人名_Java 读取控制台输入
  5. JAVA记录-SpringMVC scope属性的两种模式
  6. 自定义的ViewGroup中添加自定义View 造成的无法显示问题(个人)
  7. 【项目经验】自动回声消除(AEC)原理
  8. oracle静默安装集群,Oracle RAC 静默安装实践
  9. 物联网和互联网有什么关系
  10. 硬核科普 | 关于半导体行业IGBT晶圆发展及应用技术详解
  11. 葵花宝典:软件开发高手是这样炼成的!
  12. 使用Beego撸了一个社区
  13. 大陆高校毕业IEEE fellow榜单
  14. JavaScript学习二
  15. Python实现一个简单课堂点名器
  16. 借助 PrivateLink 与 EMQX Cloud 建立安全可靠的连接
  17. iec104协议java_GitHub - wsan70/IEC104_microgrid: iec104协议主站客户端程序,属于微电网管理系统一部分...
  18. Django的数据库创建、连接与迁移
  19. 电商大数据日志收集系统之EFK
  20. 统一调度平台V2.0

热门文章

  1. MySQL存储引擎及InnoDB并发控制介绍
  2. vitualbox的一个问题总结
  3. 关于ajax入门案例
  4. BZOJ 1801 chess 中国象棋
  5. 详解CSS position属性
  6. 【线程】——初识线程
  7. ceph auth get boostrap-osd_那些某橙色软件都能GET到手的有文凭粗粮 速速前来种草
  8. 如果深入学习前端,大佬给你总结了几个技巧!
  9. easycode 表配置_EasyCode插件使用及模板参考
  10. 锐度越高越好吗_德国瑞好和德国GC地暖哪个好