博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
汉诺塔问题
阅读量:2242 次
发布时间:2019-05-09

本文共 1247 字,大约阅读时间需要 4 分钟。

汉诺塔

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

分析

当刚开始接触这个问题的时候,一时间不知道该如何下手,如果只是一步一步尝试,随便移,刚开始几步还好说,但要到了后面,要移的越来越多,若果还是毫无规律的移,最终只会离答案越来越远。上面的问题有64片,最终要移18,446,744,073,709,551,615步,一个人耗尽一生也不可能完成。

这时候我们就可以换一种思路,假如先把63片全部移到B上,这时候只需将A上剩的一片移到C上;然后就只需移动B上的63片了,我们再将B上的62片移到A上,最后将B上的一片移到C上…….以此类推

这里写图片描述

这就存在着某种规律:

1.将A上的63片移到B上,此时B作为辅助,A上的最后一片移到C上

2.将B上的62片移到A上,此时A作为辅助,B上的最后一片移到C上
3.将A上的61片移到B上,此时B作为辅助,A上的最后一片移到C上
…….
实际上这个问题就转化为了递归

表达式:

H(1) = 1;

H(n) = 2 * H(n-1)+1      n>1
一般式:
H(n) = 2^n - 1 (n>0)

程序实现:
#include 
int i = 0; //记录移动的次数 int move(char a, char b) { printf("%c ---> %c\n", a, b); return i++; } void Hanoi(int n, char a, char b, char c) { if (1 == n) { move(a, c); // 如果只有一个,只需将a移到c上 } else { Hanoi(n - 1, a, c, b); //将a柱子上的n-1个盘子移到b上 move(a, c); // 将a仅剩的一个移到c上 Hanoi(n - 1, b, a, c); // 将b上暂时放的n-1个盘子移到c上 } } int main() { int n = 0; scanf("%d", &n); char a = 'a'; char b = 'b'; char c = 'c'; Hanoi(n, a, b, c); printf("%d\n", i); return 0; }

这里写图片描述

你可能感兴趣的文章
详解 LSTM
查看>>
按时间轴简述九大卷积神经网络
查看>>
详解循环神经网络(Recurrent Neural Network)
查看>>
为什么要用交叉验证
查看>>
用学习曲线 learning curve 来判别过拟合问题
查看>>
用验证曲线 validation curve 选择超参数
查看>>
用 Grid Search 对 SVM 进行调参
查看>>
用 Pipeline 将训练集参数重复应用到测试集
查看>>
PCA 的数学原理和可视化效果
查看>>
机器学习中常用评估指标汇总
查看>>
什么是 ROC AUC
查看>>
Bagging 简述
查看>>
详解 Stacking 的 python 实现
查看>>
简述极大似然估计
查看>>
用线性判别分析 LDA 降维
查看>>
用 Doc2Vec 得到文档/段落/句子的向量表达
查看>>
使聊天机器人具有个性
查看>>
使聊天机器人的对话更有营养
查看>>
一个 tflearn 情感分析小例子
查看>>
attention 机制入门
查看>>