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根柱子,但是允许每次最多移动相邻的 ...
随机推荐
- Iframe标签显示目标网页的指定区域,视频可全屏可缩小
由于播放的直播视频有多余的logo和聊天框等所以需要去掉,用Iframe标签显示目标网页的指定区域,视频可全屏可缩小 用自己私人的服务器来测试吧,99买阿里云 HTML代码 <html> ...
- Qt编写物联网管理平台40-类型种类
一.前言 为了增强本系统的拓展性,做成通用的物联网管理平台,特意将控制器主设备类型.探测器子设备类型.对应种类符号等信息,全部做成表格可自定义添加和修改,这样在控制器信息表和探测器信息表管理的时候,可 ...
- Qt编写物联网管理平台35-实时曲线
一.前言 设备采集到的数据,通过曲线展示也是一种非常好的方式,尽管之前已经有了表格数据展示.设备面板展示.设备地图展示等,实时曲线也是一种不错的方式,这个用户自由选择,反正通过端口已经拿到了所有要采集 ...
- Qt数据库应用6-数据图文混排
一.前言 除了能够打印基本的文字信息数据到pdf和纸张,越来越多的应用需求还要求能够导出图片,并且要支持图文混排,相当于doc文档类似,当然也不会是太复杂的,类似于打印报表一样,有表格形式的文字描述, ...
- win7语言栏不见了,只显示搜狗输入法,不显示中文(简体)-美式键盘
参考百度经验: win7右下角输入法图标不见了[终极方法]
- tomcat源码分析(一)如何启动服务
从startup.sh入手 os400=false case "`uname`" in OS400*) os400=true;; esac PRG="$0" w ...
- 《深入理解Mybatis原理》MyBatis的sqlSession执行流程
sqlSessionFactory 与 SqlSession 正如其名,Sqlsession对应着一次数据库会话.由于数据库会话不是永久的,因此Sqlsession的生命周期也不应该是永久的,相反,在 ...
- Android 稳定性(二):治理思路篇
本文同步发布于公众号:移动开发那些事:Android 稳定性(二):治理思路篇 一般来讲Android稳定性包括crash和ANR,本文主要围绕crash(应用的crash率)来讲述如何来做Andro ...
- linux 亲测wget安装7.3 liferay流程
liferay wget 7.3版本安装1. 下载软件包 sudo wget https://sourceforge.net/projects/lportal/files/Liferay%20Port ...
- 【RocketMQ 消息中间件】RocketMQ篇之-消息存储 为什么性能高 CommitLog ConsumeQueue IndexFile 刷盘机制 同步 异步
RocketMQ篇之-消息存储 目录 RocketMQ篇之-消息存储 (前置)消息存储交互流程 (一)存储系统 1. 内存存储 2. 关系型数据库存储 3. 文件存储 (二)消息的存储和发送 1. 消 ...