老码农分享 http://blog.sciencenet.cn/u/seawan //敲键读书打酱油;

博文

最简单的Hanoi塔程序

已有 4555 次阅读 2012-4-11 21:09 |个人分类:程序片段|系统分类:教学心得| Hanoi

最关键的是想通这个问题:
n个盘子从x移动到z的过程,可以表示成为一个递推到过程,即:

“先将n-1个盘子通过z移动到y
然后将最后一个盘子(第n个盘子)直接移动到z
然后再将y上的n-1个盘子通过x移动到z。”


其次是想通如下编程思路:
如何用一个C函数的形式,表示一个盘子原来在一根针(x)上以另一根针(y)为“跳板”移动到第三根针(z的过程呢?

将n个盘子,从x柱通过y柱移到z柱的表示为:
H(n, 'x', 'y', 'z'):

则其移动思路为:
  1. H(n-1,  'x', 'z', 'y');
  2. move('x', 'z');
  3. H(n-1,  'y', 'x', 'z');

结束条件:n==1: 直接移动:

H(1,  'x', 'y', 'z')  相当于:move('x','z');


因此,最简单的程序可以写成:

====================================

int steps=1;/*这个是步数统计*/

void move(char from, char to){

  printf("%d: %c -> %cn", steps++, from, to);

}

void h(int n, char from, char via, char to){

  if(n==1){

    move(from, to);

    return;

  }

  h(n-1, from, to, via);

  move(from, to);

  h(n-1, via, from, to);

}

/*下面是以8个盘子为例的调用*/

void main(){

  h(8,'x','y','z');

}




https://blog.sciencenet.cn/blog-461456-558222.html

上一篇:从IEEE/ACM的软件从业人员职业道德看烟草研究问题
下一篇:杂种!杂种?杂种!
收藏 IP: 113.59.89.*| 热度|

2 黄富强 dulizhi95

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-23 18:34

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部