Chinaunix首页 | 论坛 | 博客
  • 博客访问: 237596
  • 博文数量: 23
  • 博客积分: 2262
  • 博客等级: 大尉
  • 技术积分: 872
  • 用 户 组: 普通用户
  • 注册时间: 2004-12-26 15:59
文章分类

全部博文(23)

文章存档

2009年(3)

2008年(20)

分类:

2009-02-21 17:48:03

作/译者:吴炳锡(Email: select reverse()),来源:http://coolriver.cublog.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究。
 
今天被一个朋友问起汉诺塔,问我能不能把学校写的一个那演示程序给他。忽然都不记得是做什么的了。后来搜一下找到:
 
汉诺塔(又称塔)问题是的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。解答结果请自己运行计算,程序见尾部。面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动。
  后来,这个传说就演变为汉诺塔游戏:
  1.有三根杆子A,B,C。A杆上有若干碟子
  2.每次移动一块碟子,小的只能叠在大的上面
  3.把所有碟子从A杆全部移到C杆上
  经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片:
  如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C
  此外,汉诺塔问题也是程序设计中的经典递归问题。
看完才想起来,当时做了一个C语言实现的演示。N久没用过C写过程序了,都忘了。
想了一下感觉这个用perl实现很容易。就简单弄出来一个过程:
 

#!/usr/bin/perl

use strict;
use warnings;

sub hnaoi {
 my ($n, $start,$end, $extra) = @_;
 if ($n == 1) {
    print "Move disk #1 from $start to $end.\n";
 } else {
    hnaoi ($n-1, $start,$extra,$end);
    print "Move disk #$n from $start to $end,\n";
    hnaoi ($n-1,$extra,$end,$start);
 }
}
&hnaoi(5,'A','C','B');

 

Move disk  #1 from A to C.
Move disk #2 from A to B,
Move disk  #1 from C to B.
Move disk #3 from A to C,
Move disk  #1 from B to A.
Move disk #2 from B to C,
Move disk  #1 from A to C.
Move disk #4 from A to B,
Move disk  #1 from C to B.
Move disk #2 from C to A,
Move disk  #1 from B to A.
Move disk #3 from C to B,
Move disk  #1 from A to C.
Move disk #2 from A to B,
Move disk  #1 from C to B.
Move disk #5 from A to C,
Move disk  #1 from B to A.
Move disk #2 from B to C,
Move disk  #1 from A to C.
Move disk #3 from B to A,
Move disk  #1 from C to B.
Move disk #2 from C to A,
Move disk  #1 from B to A.
Move disk #4 from B to C,
Move disk  #1 from A to C.
Move disk #2 from A to B,
Move disk  #1 from C to B.
Move disk #3 from A to C,
Move disk  #1 from B to A.
Move disk #2 from B to C,
Move disk  #1 from A to C.

阅读(1189) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~