当前位置:网站首页>汉诺塔问题
汉诺塔问题
2022-06-22 05:03:00 【姜学迁】
汉诺塔:简单来说,就是一个大盘子和一堆小盘子的移动游戏。
先把小盘子们移到中间,再把大盘子移到最后,最后把小盘子们摞到大盘子上面。
如果是两个盘子,小盘子移到中间,大盘子移到最后,小盘子再放到大盘子上面来,很符合这个流程。

如果是三个盘子呢,此时我们应该分开来看。
先不看大盘子,对小盘子们来说,它们的目标是全部放到中间。这么来看,两个小盘子又是一个汉诺塔问题,只不过我们最开始说的“中间”对新的汉诺塔问题而言,变成了“最后”。
好像有些抽象,我们编号看看。
我们标记整个问题:A为起始,B为中间,C为目标。
对于两个小盘子来说:A为起始,B为目标,C为中间。
我们先忽略大盘子,当它不存在,处理小盘子。移动两个汉诺塔,还是很简单的。
进行汉诺塔排序:A——>C,A——>B,C——>B。完成了整个过程。两个盘子的游戏结束。
再让大盘子回来,并且执行A——>C。
此时两个小盘子又是一个经典的汉诺塔问题,而且B成了起始柱,A成了中间柱,C成了目标柱。
再进行一次汉诺塔排序:B——>A,B——>C,A——>C。
汉诺塔排列完成。
那么根据这个过程,我们来写代码:
void hanoi(int n, char A, char B, char C) //三个柱子,总问题,A为起始,B为中间,C为目标。
{
if (n==1) //一个盘子的情况,起始——>目标
{
printf("%c——>%c\n", A, C);
}
else //两个盘子的情况,A为起始,B为目标,C为中间。
{
hanoi(n - 1, A, C, B); //起始——>目标,因为2-1=1,所以直接排
printf("%c——>%c\n", A, C); //大盘子A——>C
hanoi(n - 1, B, A, C); //小盘子从B目标转到C目标,因为2-1=1,所以直接排
}
}
所有的大于两个盘子的情况,都会落实到一次次的递归当中。我们关心的是一个盘子、两个盘子怎么移动,最多关心三个盘子怎么移动。每一次递归,柱子的定位都会发生改变,而盘子的变化是有限的。我们的思维认为,固定的柱子不变,活动的盘子移动,但在递归的过程中,柱子是在变化的。
#include <stdio.h>
void hanoi(int n, char A, char B, char C)
{
if (n==1)
{
printf("%c——>%c\n", A, C);
}
else
{
hanoi(n - 1, A, C, B);
printf("%c——>%c\n", A, C);
hanoi(n - 1, B, A, C);
}
}
int main()
{
hanoi(3, 'A', 'B', 'C');
return 0;
}
说真的,似懂非懂的感觉最难受了。我能感觉到它就是这个样,但就是想不通整个过程。/狗头
边栏推荐
- uwsgi-invalid-request-block-size invalid request block size: 21327 (max 4096)...skip 的解决办法
- Disturbed when programmers are programming? Daily anecdotes
- The application of RPC technology and its framework sekiro in crawler reverse, encrypting data is a shuttle!
- 使用Chrome调试微信内置浏览器
- Postman uses (reads) JSON files for batch testing
- Great! Huaibei and Huaibei enterprises are approved to use special marks for geographical indication products
- 软件架构与模式:结构、组件、关系
- 【故障诊断】使用多线程,程序不报错,但就是不运行
- 数据的备份与恢复
- Graph calculation on nlive:nepal's graph calculation practice
猜你喜欢
![[fault diagnosis] stitch Py script failure](/img/5c/e5df21674b5d0677484b49a608f8ae.png)
[fault diagnosis] stitch Py script failure

10道不得不会的 Redis 面试题
![[details] domestic website filing process and steps](/img/be/be74c1e586ff01403fcafff19a462a.jpg)
[details] domestic website filing process and steps

【故障诊断】stitch.py脚本失效

Great! Huaibei and Huaibei enterprises are approved to use special marks for geographical indication products

UC San Diego | evit: using token recombination to accelerate visual transformer (iclr2022)

软件架构与模式:结构、组件、关系

Redis master-slave replication

Slurm tutorial

Graph calculation on nlive:nepal's graph calculation practice
随机推荐
Database - basic knowledge
go学习(二、内建容器)
当程序员编程时被打扰 | 每日趣闻
UC San Diego | evit: using token recombination to accelerate visual transformer (iclr2022)
JUC - 线程中断与线程等待、唤醒(LockSupport)
Flink deployment mode (I) - standalone and Application
Remote Dictionary Server(Redis)——基于 KV 结构的作为 Cache 使用的 NoSQL 数据库管理系统
lua笔记
JUC - thread interrupt and thread waiting and wakeup (locksupport)
MySQL common SQL
MySQL day04 class notes
numpy庫常用知識整理
Great! Huaibei and Huaibei enterprises are approved to use special marks for geographical indication products
【科研笔记】Focal Loss
Kotlin project reports an error and lacks coroutinecontext dependency
[scientific research notes] focal loss
【使用指南】清华源的使用
Disturbed when programmers are programming? Daily anecdotes
flink部署模式总结
Restframework read and non read sequence processing