汉诺游戏规则如下:

1、有三根相邻的柱子,标号为A,B,C。

2、A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘。

3、现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。

程序要求:

输入盘子个数,输出完成步骤。

解决思路:

在完成题目前,首先应对游戏规则和解题方法有所了解,此处借7k7k小游戏中的汉诺塔(3个)演示。

首先我们的目的是把A的三个盘子移到C处,所以首先应完成的便是把上两个盘子放到B上,才能把第三个(最大的)盘子放到C,接着把B上的两个放到C上。

所以这时我们发现,B的作用便是用来暂时存放除了最后一个的其他所有盘子,以便后续操作

所以我们可以设置x,y,z三个变量,分别表示初始盘子的位置,借放盘子的位置,最终完成的位置。

注意:x,y,z不一定与A,B,C始终一一对应!!!

A,B,C只是杆的名字!!!

因此程序的步骤:

1.当盘子等于一个,直接由x移到z。

2.当盘子大于一个(假设n个),先把n-1个盘子移到y,把第n个也就是最后一个大的,移到z。

3.把y上的盘子移到z。

刚开始我们把A,B,C对应x,y,z

这时有个问题怎么把x上的盘子移到y呢,这时我们就要转换一下,先忽略掉第三个最大的盘的存在,把B杆看成目的地,C杆就变成y了(这就是为什么说ABC与xyz不是一定对应的原因)

完成了上两个转移到B杆,便可以把A杆的最大盘移到C

但当我们完成步骤2时,我们可以把原来的y也就是b杆看成是x(初始放盘子的地方),A杆看成y,C杆看成z(目的地),这时候便于刚开始步骤相似了

{{uploading-image-916509.png(uploading...)}}

所以重要的便是对盘子个数的判断和对xyz的转换

所以可以动手写代码了,如下:

void Hanoi(int n, char x, char y, char z) //n为盘子个数
{
void move(char x, char z);
if (1 == n)//当n等于1,执行步骤1
{
move(x, z);
}
else //当n不等于1,执行步骤2
{
Hanoi(n - 1, x, z, y);//把n-1从x移到y,所以原来的z便是现在借放的y,y同,所以反过来
Hanoi(1, x, y, z);//完成上一步x移到上一步的y,就把最后的第n个从x移到z
Hanoi(n - 1, y, x, z);//(此时的y有n-1个盘子,看成初始位置x),目的地还是z
}
}

所以通过上面的操作便完成了盘子的所有移到

move函数的定义:

void move(char x, char z)
{
printf("%c ---> %c \n", x, z);
}

所以整个程序的代码如下:

int main() {
int n = 0;
void Hanoi(int n, char x, char y, char z);
printf("请输入所要移动的盘子的个数:");
scanf("%d", &n);
Hanoi(n, 'A', 'B', 'C');
} void Hanoi(int n, char x, char y, char z)
{
void move(char x, char z);
if (1 == n) {
move(x, z);
} else {
Hanoi(n - 1, x, z, y);
Hanoi(1, x, y, z);
Hanoi(n - 1, y, x, z);
}
} void move(char x, char z)
{
printf("%c ---> %c \n", x, z);
}

学C记录(理解递归问题之汉诺塔)的更多相关文章

  1. 递归--练习2--noi6261汉诺塔

    递归--练习2--noi6261汉诺塔 一.心得 先把递推公式写出来,会很简单的 二.题目 6261:汉诺塔问题 总时间限制:  1000ms 内存限制:  65536kB 描述 约19世纪末,在欧州 ...

  2. py_递归实例:汉诺塔问题

    递归的两个特点 调用自身 结束条件 # _*_coding:utf-8 ''' 递归实例:汉诺塔问题 n----盘子总数 a----第一个柱子 b----第二个柱子 c----第三个柱子 n个盘子时: ...

  3. 递归可视化之汉诺塔的动画实现(turtle海龟)

    import turtle class Stack: def __init__(self): self.items = [] def isEmpty(self): def push(self, ite ...

  4. 递归函数初步理解---python实现(汉诺塔问题)

    递归常被用来描述以自相似的方法重复事物的过程,在程序中指的是在函数定义中使用函数自身的方法. 递归是一个树结构,分为递推和回归的过程,当递推到达底部时,就会开始回归. 问题描述:A比B大两岁,B比C大 ...

  5. 编程:递归编程解决汉诺塔问题(用java实现)

    Answer: //Li Cuiyun,October 14,2016. //用递归方法编程解决汉诺塔问题 package tutorial_3_5; import java.util.*; publ ...

  6. 关于C++的递归(以汉诺塔为例)

    关于C++,hanoi塔的递归问题一直是个经典问题,我们学习数据结构的时候也会时常用到, 因为它的时间复杂度和空间复杂度都很高,我们在实际的应用中不推荐使用这种算法,移动n个盘子, 需要2的n次幂减一 ...

  7. C++入门经典-例4.3-函数的递归调用之汉诺塔问题

    1:代码如下: // 4.3.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  8. 算法笔记_013:汉诺塔问题(Java递归法和非递归法)

    目录 1 问题描述 2 解决方案  2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...

  9. C#中汉诺塔问题的递归解法

    百度测试部2015年10月份的面试题之——汉诺塔. 汉诺塔就是将一摞盘子从一个塔转移到另一个塔的游戏,中间有一个用来过度盘子的辅助塔. 百度百科在此. 游戏试玩在此. 用递归的思想解决汉诺塔问题就是分 ...

随机推荐

  1. MLIR中间表示和编译器框架

    MLIR中间表示和编译器框架 TensorFlow生态系统包含许多在软件和硬件堆栈的多个级别上运行的编译器和优化器.作为TensorFlow的日常用户,使用不同类型的硬件(GPU,TPU,移动设备)时 ...

  2. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  3. 深度树匹配模型(TDM)

    深度树匹配模型(TDM) 算法介绍 Tree-based Deep Match(TDM)是由阿里妈妈精准定向广告算法团队自主研发,基于深度学习上的大规模(千万级+)推荐系统算法框架.在大规模推荐系统的 ...

  4. Qt信号槽机制理解

    1. 信号和槽概述 > 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式(发布-订阅模式).当某个`事件`发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(s ...

  5. 九、Nginx常见问题处理

    优化Nginx并发量 优化软件进程数.优化软件最大并发连接数限制.优化内核连接数限制open files(临时和永久同时设置)   [root@proxy ~]# ab -n 2000 -c 2000 ...

  6. Spring Boot WebFlux-09——WebFlux 集成测试及部署

    第09课:WebFlux 集成测试及部署 前言 在日常工作中,免不了自测 UT,因为覆盖率不达标,是不允许提交测试,那怎么进行 WebFlux 项目的测试呢.@WebFluxTest 是 WebFlu ...

  7. 【题解】ball 数论

    题目 题目描述: 众所周知的是Dr.Bai 穷困潦倒负债累累,最近还因邦邦的出现被班上的男孩子们几乎打入冷宫,所以Dr.Bai 决定去打工赚钱. Dr.Bai 决定做玩♂球的工作,工作内容如下. 老板 ...

  8. 如何编写shell脚本

    1.首先创建一个目录 vi hello.sh 2.编写shell第一行 #!/bin/bash    (为了声明是shell脚本,第一行都要这么写) 3.可以添加注释     #the first p ...

  9. .NET 云原生架构师训练营(Identity Server)--学习笔记

    目录 OAuth 2.0 OpenID Connect QuickStart OAuth 2.0 概念 过程 通信 组件 示例代码 概念 OAuth 2.0 是一个授权协议,它允许软件应用代表(而不是 ...

  10. 温故知新,DotNet Core SDK和.Net CLI十八般武艺

    简介 .NET命令行接口 (CLI) 工具是用于开发.生成.运行和发布.NET应用程序的跨平台工具链. https://docs.microsoft.com/zh-cn/dotnet/core/too ...