汉诺游戏规则如下:

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. Tengine Framework基础

    Tengine Framework基础 最受开发者喜爱的边缘AI计算框架 Tengine是OPEN AI LAB推出的自主知识产权的边缘AI计算框架,致力于解决AIoT产业链碎片化问题,加速AI产业化 ...

  2. TVM自动调度器

    TVM自动调度器 随着模型大小,算子多样性和硬件异构性的不断增长,优化深度神经网络的执行速度非常困难.从计算的角度来看,深度神经网络只是张量计算的一层又一层.这些张量计算(例如matmul和conv2 ...

  3. MindSpore技术理解(上)

    MindSpore技术理解(上) 引言 深度学习研究和应用在近几十年得到了爆炸式的发展,掀起了人工智能的第三次浪潮,并且在图像识别.语音识别与合成.无人驾驶.机器视觉等方面取得了巨大的成功.这也对算法 ...

  4. NSight Compute 用户手册(上)

    NSight Compute 用户手册(上) 非交互式配置文件活动 从NVIDIA Nsight Compute启动目标应用程序 启动NVIDIA Nsight Compute时,将出现欢迎页面.单击 ...

  5. 基于SSL(TLS)的HTTPS网页下载——如何编写健壮的可靠的网页下载

    源码下载地址案例开发环境:VS2010本案例未使用openssl库,内部提供了sslite.dll库进行TLS会话,该库提供了ISSLSession接口用于建立SSL会话. HTTP协议很简单,写个简 ...

  6. Python“九九乘法表”

    用Python语言编程,使用双重循环语句输出"九九乘法表". for i in range(1, 10): # 控制行 for j in range(1, i+1): # 控制列 ...

  7. 【NX二次开发】图标图像

    用户定义位图的目录位置的环境变量 UGII_BITMAP_PATH 在NX日志中查看NX图标需要设置的变量 变量名:PRINT_DIALOG_BITMAP_NAMES 变量值:1 查看系统图标的方法1 ...

  8. Mysql_SQLyog 数据库的创建

    1.创建数据库 CREATE DATABASE [IF NOT EXISTS] westos; 2.删除数据库 DROP DATABASE [IF EXISTS] westos; 3.使用数据库 -- ...

  9. 使用Flutter设计一个好看的"我"页面

    近期遇到一些很烦的琐事,状态比较down,很多原本计划好的事情都耽搁了,实在是难顶-- 看到后台一直有朋友问怎么博客和公众号没有更新,所以我忙完得闲就来更了! 前言 起因是最近重拾以前的旧项目(业余做 ...

  10. Java持久层框架Mybatis入门

    MyBatis是什么 MyBatis是Java的持久层框架,GitHub的star数高达15.8k,是Java技术栈中最热门的ORM框架之一.它支持自定义SQL.存储过程以及高级映射,可以通过XML或 ...