Hanoi-C
什么是汉诺塔?汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
这是一个可视化的汉诺塔模型,我们完成这个游戏的思路就是要将第一个柱子上的所有圆盘按照从大到小的顺序罗列。
那么假设我们有 n 个圆盘,我们想让第 n 个圆盘移动到 T3 上面,那我们是不是得让 ( N-1) 个盘子移动到 T2 上,这样我们才可以让 N 盘移动到 T3 上。就像这样
那么我们在移动的这个过程中,我们就可以把 T1 叫做起始柱,然后 T2 叫做工具柱。
那现在,我们的 n 盘已经在 T3 上了,然后(N-1)也已经在 T2 上了,现在,T2 就是起始柱,T1 就是工具柱,那我们现在的思路是不是就是让起始柱上的第 n 个盘(哦,感觉不应该叫做第 N 个盘子,应该是第 n-1 个,然后 n-1 上面的盘子应该叫做 n-2,这样才正确) 移动到 T3 上,然后 (n-2)的盘移动到我们的工具柱上。
最后我们将最终的盘子移动到 T3 上就完成游戏了。
那我们用代码来写这道题
首先我们创建一个函数,来执行我们的汉诺塔的逻辑运算
//函数参数声明
/*
声明汉诺塔问题的递归函数
参数:
diskCount: 盘子的数量
sourcePeg: 源柱子
auxPeg: 辅助柱子
targetPeg: 目标柱子
*/
int hanoi(int diskCount, char sourcePeg, char auxPeg, char targetPeg)
{
//如果一个盘子都没有的话,就直接退出。
if(diskCount == 0)
{
return 0;
}
//如果只有一个disk的话,就直接将sourcePeg上的盘子移动到targetPeg上面
if(diskCount == 1)
{
printf("move %c to %c \n", sourcePeg, targetPeg);
}
/*
多个disk的情况
将diskCount-1个盘子从sourcePeg移动到auxPeg上面
将最后一个盘子从sourcePeg移动到targetPeg上面
将diskCount-1个盘子从auxPeg移动到targetPeg上面
递归调用
*/
else
{
hanoi(diskCount - 1, sourcePeg,targetPeg, auxPeg);
printf("move %c to %c \n", sourcePeg, targetPeg);
hanoi(diskCount - 1,auxPeg,sourcePeg,targetPeg);
}
//习惯。
return 0 ;
}
我们只讲讲 else 部分的代码,因为我在这里想了很久,然后也错了一些。
我们知道在汉诺塔里面,我们需要将 N-1 部分的柱子移动到 T1 上,这样才可以将 T1 的 n 柱子移动到 T3,那么我们就可以知道第 32 行的代码为什么是
hanoi(diskCount - 1, sourcePeg,targetPeg, auxPeg);
因为我们 (n-1)的目标柱是 T2,因为我们要将 n-1 全部移动到 T2 上面,所以,此时 T3 为工具柱。
好了,我们现在知道了 32 行的代码逻辑,那么经过了 32 行代码执行后,我们现在(n-1)都在 T2 上,N 在 T3 上,现在我们需要将 N-1 的部分通过 T1 这个辅助柱子来将 n-1 按大到小移动到 T3 上。
所以 34 行的代码为
hanoi(diskCount - 1,auxPeg,sourcePeg,targetPeg);
总代码:
// 汉诺塔问题
/*
声明汉诺塔问题的递归函数
参数:
diskCount: 盘子的数量
sourcePeg: 源柱子(起始柱子)
auxPeg: 辅助柱子(中间柱子)
targetPeg: 目标柱子(最终柱子)
*/
#include "stdio.h"
int hanoi(int diskCount, char sourcePeg, char auxPeg, char targetPeg);
int main()
{
int diskCount;
printf("请输入盘子数:");
scanf("%d", &diskCount);
hanoi(diskCount, 'A', 'B', 'C');
return 0;
}
int hanoi(int diskCount, char sourcePeg, char auxPeg, char targetPeg)
{
//如果一个盘子都没有的话,就直接退出。
if(diskCount == 0)
{
return 0;
}
//如果只有一个disk的话,就直接将sourcePeg上的盘子移动到targetPeg上面
if(diskCount == 1)
{
printf("move %c to %c \n", sourcePeg, targetPeg);
}
/*
多个disk的情况
将diskCount-1个盘子从sourcePeg移动到auxPeg上面
将最后一个盘子从sourcePeg移动到targetPeg上面
将diskCount-1个盘子从auxPeg移动到targetPeg上面
递归调用
*/
else
{
hanoi(diskCount - 1, sourcePeg,targetPeg, auxPeg);
printf("move %c to %c \n", sourcePeg, targetPeg);
hanoi(diskCount - 1,auxPeg,sourcePeg,targetPeg);
}
//习惯。
return 0 ;
}
Hanoi-C的更多相关文章
- Hanoi问题java解法
用什么语言解法都差不多,思路都是一样,递归,这其中只要注重于开始和结果的状态就可以了,对于中间过程,并不需要深究.(我细细思考了一下,还是算了.=_=) 代码其实很简单注重的是思路. 问题描述:有一个 ...
- HDU1329 Hanoi Tower Troubles Again!——S.B.S.
Hanoi Tower Troubles Again! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- ZOJ-1239 Hanoi Tower Troubles Again!
链接:ZOJ1239 Hanoi Tower Troubles Again! Description People stopped moving discs from peg to peg after ...
- Hanoi问题
#include<stdio.h>int main(){ int m; void hanoi(int n,char x,char y,char z); printf("input ...
- The Towers of Hanoi Revisited---(多柱汉诺塔)
Description You all must know the puzzle named "The Towers of Hanoi". The puzzle has three ...
- Hanoi塔
2016-03-19 17:01:35 问题描述: 假设有三个命名为 A B C 的塔座 ,在塔座A上插有n个直径大小不相同,由小到大编号为1 ,2 ,3 ,··· ,n的圆盘,要求将A座上的圆盘移至 ...
- [CareerCup] 3.4 Towers of Hanoi 汉诺塔
3.4 In the classic problem of the Towers of Hanoi, you have 3 towers and N disks of different sizes ...
- 栈应用hanoi
/* 课本p54页*/ #include<stdio.h> #include <iostream> using namespace std; void move(int n, ...
- 【数据结构】hanoi
#include<stdio.h> void hanoi(int n,char x,char y,char z) { ; ) printf("%d. Move disk %d f ...
- 算法训练 Hanoi问题
算法训练 Hanoi问题 时间限制:1.0s 内存限制:512.0MB 问题描述 如果将课本上的Hanoi塔问题稍做修改:仍然是给定N只盘子,3根柱子,但是允许每次最多移动相邻的 ...
随机推荐
- 【MyBatis】学习笔记03:配置文件进一步解读(非常重要)
[Mybatis]学习笔记01:连接数据库,实现增删改 [Mybatis]学习笔记02:实现简单的查 目录 核心配置文件 properties 将properties文件引入到核心文件 typeAli ...
- arch linux deepin-wine-wechat
https://aur.archlinux.org/packages/deepin-wine-wechat md5sum for WeChatSetup-3.9.0.28.exe should be ...
- fabric2.0开发 基本环境安装配置(docker docker-compose go node git等)(1)
转载:https://blog.csdn.net/tank_ft/article/details/105298053 基本环境:Ubuntu16.04 linux 在安装相关软件之前建议没有更换国内源 ...
- CentOS 安装NFS
背景 Kubernetes 对 Pod 进行调度时,以当时集群中各节点的可用资源作为主要依据,自动选择某一个可用的节点,并将 Pod 分配到该节点上.在这种情况下,Pod 中容器数据的持久化如果存储在 ...
- TensorRT-YOLO:灵活易用的 YOLO 部署工具
TensorRT YOLO TensorRT-YOLO 是一款专为 NVIDIA 设备设计的易用灵活.极致高效的YOLO系列推理部署工具.项目不仅集成了 TensorRT 插件以增强后处理效果,还使用 ...
- Hugo 静态博客部署
I. 前提条件 1.1 安装 Hugo 1.1.1 Windows 1.下载 Hugo(建议下载扩展版):Hugo(github.com) 2.解压 Hugo 压缩包到指定目录. 3.[Win + R ...
- TNN-linux编译测试记录
Github: https://github.com/Tencent/TNN docs: https://github.com/Tencent/TNN/blob/master/doc/cn/user/ ...
- JSON和XML的对比及应用领域
JSON和XML的对比 对比表格 对比维度 JSON XML 可读性 通常更简洁,易于阅读和编写12 结构清晰,但可能因标签和属性而显得冗长1 解析难度 解析通常比XML简单,多数现代编程语言内置解析 ...
- tomcat常用配置详解和优化方法-copy
tomcat常用配置详解和优化方法 参考: http://blog.csdn.net/zj52hm/article/details/51980194 http://blog.csdn.net/wuli ...
- 第三章 dubbo源码解析目录
7.6 服务远程暴露 - 注册服务到zookeeper 为了安全:服务启动的ip全部使用10.10.10.10 远程服务的暴露总体步骤: 将ref封装为invoker 将invoker转换为expor ...