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根柱子,但是允许每次最多移动相邻的 ...
随机推荐
- Llama 3.2 900亿参数视觉多模态大模型本地部署及案例展示
Llama 3.2 900亿参数视觉多模态大模型本地部署及案例展示 本文将介绍如何在本地部署Llama 3.2 90B(900亿参数)视觉多模态大模型,并开发一些Use Case,展示其强大的视觉理解 ...
- 如何设置AD域用户仅登录到指定的计算机?AD域管理软件
一 什么是AD域? 简单理解:Active Directory域内的directory database(目录数据库)是被用来存储用户账户.计算机账户.打印机和共享文件夹等对象,而提供目录服务的组件就 ...
- Python 进阶:深入理解 import 机制与 importlib 的妙用
大家好,今天我们来深入探讨 Python 中的导入机制和 importlib 模块.相信不少朋友和我一样,平时写代码时可能只用过最基础的 import 语句,或者偶尔用 importlib.impor ...
- Redis 源码简洁剖析 08 - epoll
select, poll, epoll 源码分析 参考链接 Redis 源码简洁剖析系列 select, poll, epoll 关于 select, poll, epoll,网络 IO 演变发展过 ...
- WSL设置中文、修改默认Root登陆、添加右键菜单
1.设置中文 首先安装 aptitude 管理工具 #apt-get install aptitude 然后安装语言环境并进入语言环境设置. #aptitude install locales #dp ...
- docker-daemon配置
{ "api-cors-header":"", ------在引擎API中设置CORS标头 "authorization-plugins": ...
- Android稳定性(一):内存使用指南
本文同步发布于公众号:移动开发那些事:Android稳定性(一):内存使用指南 1 背景 团队内目前使用Flutter来开发移动端的应用,不可避免会涉及到一些原生代码的编写,而团队内有好些iOS出身的 ...
- 【转】为什么说java只有值传递?
原文地址: https://www.cnblogs.com/ironHead-cjj/p/11366888.html
- 搭建springboot web系统
一.集成spring-data-jpa 我在实际项目中使用mybaties居多,但是个人喜欢spring-data-jpa,在 1. 添加依赖 <!-- 数据源依赖 --> <dep ...
- nio-总结列表
java IO体系图 IO流的操作规律总结: 1,明确体系:数据源:InputStream ,Reader数据汇:OutputStream,Writer 2,明确数据:因为数据分两种:字节,字符.数据 ...