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根柱子,但是允许每次最多移动相邻的 ...
随机推荐
- 更改linux文件/目录的权限、拥有者及用户组
在Linux中,创建一个文件时,该文件的拥有者都是创建该文件的用户.该文件用户可以修改该文件的拥有者及用户组,root用户可以修改任何文件的拥有者及用户组. 在Linux中,对于文件的权限(rwx), ...
- LiquibaseException java.lang.ClassCastException: class java.time.LocalDateTime cannot be cast to class java.lang.String
https://forum.liquibase.org/t/liquibaseexception-java-lang-classcastexception-class-java-time-locald ...
- rsync+ssh同步备份文件
定期对web代码或重要的文件做同步异地服务器备份,防止服务器故障严重磁盘损坏时文件丢失的问题. 备份服务器:192.168.200.134 目标服务器:192.168.201.65 rsync同步命令 ...
- Qt编写地图综合应用11-动态添加
一.前言 在添加设备点或者区域形状的时候,会考虑是直接静态的方式写入到网页中加载,还是动态js函数异步加载的方式,这个需要根据现场的实际需求来,如果只需要一次加载的话建议静态即可,如果运行期间还需要动 ...
- Vue cli 2.x 3.x及4.x区别
原文链接: 1.Vue cli 2.x 3.x及4.x区别 2.vue-cli2.0/3.0/4.0创建项目的方式差异解读和vue-cli4.0打包命令和环境配置
- @wraps 修饰器:让你的 Python 代码更加简短可爱 | 从简单实例来认识它
@wraps 修饰器:让你的 Python 代码更加简短可爱 | 从简单实例来认识它 我们在上一篇文章(Python实例来认识并发与并行)中用到了 @timer ,在函数定义时,加上一个小小的 @ti ...
- FreeSWITCH日志功能分析及apr模拟
操作系统版本:Debian 12.5_x64 FreeSWITCH版本: 1.10.11 apr库版本:apr-1.7.4 & apr-util-1.6.3 gcc版本: 12.2.0 日 ...
- ResponseBody与RequestBody-copy
1. ResponseBody @ResponseBody的作用其实是将java对象转为json格式的数据. @responseBody注解的作用是将controller的方法返回的对象通过适当的转换 ...
- 单点登录-OAuth2
单点登录的实现原理 单点登录在现在的系统架构中广泛存在,他将多个子系统的认证体系打通,实现了一个入口多处使用,而在架构单点登录时,也会遇到一些小问题,在不同的应用环境中可以采用不同的单点登录实现方案来 ...
- 一篇关于c语言的大补帖
一晃今年又开始了,作为一个失意的中年技术男,现在的心境真的是五味杂陈.赶紧写一篇吧,我怕过了这个点,今年就在没有那个心情去写了. 因为是基础嘛,从事软件开发以来c或者c++相关的东西断断续续 也刷了差 ...