说明双色河内塔与三色河内塔是由之前所介绍过的河内塔规则衍生而来,双色河内塔的目的是将下图左上的圆环位置经移动成为右下的圆环位置:

而三色河内塔则是将下图左上的圆环经移动成为右上的圆环:

解法无论是双色河内塔或是三色河内塔,其解法观念与之前介绍过的河内塔是类似的,同样也是使用递回来解,不过这次递回解法的目的不同,我们先来看只有两个盘的情况,这很简单,只要将第一柱的黄色移动至第二柱,而接下来第一柱的蓝色移动至第三柱。

再来是四个盘的情况,首先必须用递回完成下图左上至右下的移动:

接下来最底层的就不用管它们了,因为它们已经就定位,只要再处理第一柱的上面两个盘子就可以了。那么六个盘的情况呢?一样!首先必须用递回完成下图左上至右下的移动:

接下来最底层的就不用管它们了,因为它们已经就定位,只要再处理第一柱上面的四个盘子就可以了,这又与之前只有四盘的情况相同,接下来您就知道该如何进行解题了,无论是八个盘、十个盘以上等,都是用这个观念来解题。

那么三色河内塔呢?一样,直接来看九个盘的情况,首先必须完成下图的移动结果:

接下来最底两层的就不用管它们了,因为它们已经就定位,只要再处理第一柱上面的三个盘子就可以了。

代码部分

#include <stdio.h>void hanoi(int disks, char source, char temp, char target) {if (disks == 1) {printf("move disk from %c to %c\n", source, target);printf("move disk from %c to %c\n", source, target);} else {hanoi(disks-1, source, target, temp);hanoi(1, source, temp, target);hanoi(disks-1, temp, source, target);}
}void hanoi2colors(int disks) {char source = 'A';char temp = 'B';char target = 'C';int i;for(i = disks / 2; i > 1; i--) {hanoi(i-1, source, temp, target);printf("move disk from %c to %c\n", source, temp);printf("move disk from %c to %c\n", source, temp);hanoi(i-1, target, temp, source);printf("move disk from %c to %c\n", temp, target);}printf("move disk from %c to %c\n", source, temp);printf("move disk from %c to %c\n", source, target);
}int main() {int n;printf("请输入盘数:");scanf("%d", &n);hanoi2colors(n);return 0;
} 三色河内塔 C 实作
#include <stdio.h>void hanoi(int disks, char source, char temp, char target) {if (disks == 1) {printf("move disk from %c to %c\n", source, target);printf("move disk from %c to %c\n", source, target);printf("move disk from %c to %c\n", source, target);} else {hanoi(disks-1, source, target, temp);hanoi(1, source, temp, target);hanoi(disks-1, temp, source, target);}
}void hanoi3colors(int disks) {char source = 'A';char temp = 'B';char target = 'C';int i;if(disks == 3) {printf("move disk from %c to %c\n", source, temp);printf("move disk from %c to %c\n", source, temp);printf("move disk from %c to %c\n", source, target);printf("move disk from %c to %c\n", temp, target);printf("move disk from %c to %c\n", temp, source);printf("move disk from %c to %c\n", target, temp);;}else {hanoi(disks/3-1, source, temp, target);printf("move disk from %c to %c\n", source, temp);printf("move disk from %c to %c\n", source, temp);printf("move disk from %c to %c\n", source, temp);hanoi(disks/3-1, target, temp, source);printf("move disk from %c to %c\n", temp, target);printf("move disk from %c to %c\n", temp, target);printf("move disk from %c to %c\n", temp, target);hanoi(disks/3-1, source, target, temp);printf("move disk from %c to %c\n", target, source);printf("move disk from %c to %c\n", target, source);hanoi(disks/3-1, temp, source, target);printf("move disk from %c to %c\n", source, temp);for (i = disks / 3 - 1; i > 0; i--) {if (i>1) {hanoi(i-1, target, source, temp);}printf("move disk from %c to %c\n",target, source);printf("move disk from %c to %c\n",target, source);if (i>1) {hanoi(i-1, temp, source, target);}printf("move disk from %c to %c\n", source, temp);}}
}int main() {int n;printf("请输入盘数:");scanf("%d", &n);hanoi3colors(n);return 0;
} 

双色、三色河内塔问题相关推荐

  1. 0.0.1价签墨水屏篇node8266点亮篇[例4.2寸2色3色IC SSD1683]

    没办法,就是对这些好玩的东西充满好奇 海鲜市场一堆价签,汉硕.SES.杭州智控.小飞.狗东.等等各种价签,大公司小公司的都有,大公司的开发能力强,压缩成本极致,对于二次开发价签理论上越小众的越值得买, ...

  2. 具体数学 递归问题1.1 从河内塔/汉诺塔开始

    河内塔问题 在经典河内塔问题中,有3根柱子和N个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子.一开始,所有盘子自上而下按从大到小依次套在一根柱子上,现在想将所有的圆盘按照原来的位置从一根柱子移动到另一 ...

  3. 汉诺塔(hanoi)、双色汉诺塔(分离型)、三色汉诺塔

    汉诺塔 汉诺塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市:1883年法国数学家Edouard Luca ...

  4. 每天一算法(双色河内塔又叫汉诺塔)

    说明 双色河内塔是由之前所介绍过的河内塔规则衍生而来,双色河内塔的目的是将下图左上的圆环位置经移动成为右下的圆环位置: 解法 双色河内塔或是原始的河内塔,其解法观念与之前介绍过的河内塔是类似的,同样也 ...

  5. “三色河内塔”算法(三色汉诺塔)

    问题引入 "三色河内塔"由"河内之塔"的规则衍生而来(点击查看),区别在于三色河内塔的目的是将图1所示的圆盘位置,移动成为图2所示的圆盘位置."三色河 ...

  6. “双色河内塔”算法(双色汉诺塔)

    问题引入 "双色河内塔"由"河内之塔"的规则衍生而来(点击查看),区别在于双色河内塔的目的是将图1所示的圆盘位置,移动成为图2所示的圆盘位置. 图1 图2 问题 ...

  7. C语言经典算法 - 双色河内塔的代码

    把内容过程常用的内容片段记录起来,如下的内容内容是关于C语言经典算法 - 双色河内塔的内容,希望能对各位朋友有所好处. #include <stdio.h> void hanoi(int ...

  8. 河内塔c语言编程,C语言经典算法 - 双色河内塔

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. #include void hanoi(int disks,char source,cha ...

  9. 传感器自学笔记第十二章——火焰传感器+HC-SR501人体感应模块+按键模块+红绿双色LED(共阴)模块+按键开关模块+三色LED

    作者:GWD 时间:2019.06.28 火焰传感器(开关量类传感器) 一. 学习要点:无 二. 手册分析: 用途:各种火焰,火源探测 模块特色: 1. 可以检测火焰或者波长在760纳米-1100纳米 ...

最新文章

  1. 在一个JSP页面中包含另一个JSP页面的三种方式
  2. Scikit-Learn 机器学习笔记 -- SVM
  3. 【转】ANSI与GB2312的编码问题
  4. 微软技术专家为您解读深度学习
  5. 《MySQL——InnoDB与Memory以及临时表》
  6. symbian系统开发教程(一)
  7. Redis哈希表总结
  8. oracle 返回list,myabatis oracle 调用存储过程返回list结果集
  9. 解决crlf 和 lf不同带来的冲突问题
  10. 前端知识天天学(1)
  11. R语言学习笔记:路径设置与安装包
  12. 坐拥百度/阿里/腾讯,这家车载导航上市公司的营收却一路下挫?
  13. 数据结构与算法之排序篇(下)
  14. c mysql trans_MYSQL STRICT_TRANS_TABLES使用图解教程
  15. 01百思不得其姐基本配置
  16. python mysqldb insert_Python MySQLdb 插入数据
  17. jetty9 Form too large 异常解决方案
  18. 如何增加百度收录有什么方法
  19. 大白菜装机版一键制作启动u盘教程
  20. 如何选购一台笔记本电脑

热门文章

  1. 一年狂赚2个亿,一个头条100万,GQ实验室、视觉志
  2. c语言出现-1. qnano,qnanopainter,实现OpenGL加速 Qt5 C++ UI组件的库,下载qnanopainter的源码_GitHub_开发99...
  3. Layui(三) iframe层(弹窗)input就有主窗体的传值
  4. python 汉字编码_python对于中文编码处理的几种方式
  5. 前端开发的小伙伴们,win10系统经常遇到C盘空间不够,三步操作C盘瞬间多了10G以上
  6. Netty教程06:netty实现群聊私聊
  7. JavaScript里的event
  8. window7安装python3.7
  9. 从机械自动化专业到百度腾讯拼多多Java工程师转行之路
  10. 当日竟涨6000万播放,三农新号靠这一个套路爆了