查看完整版本: 2008-04-18 Ruby 测试题(00013)

jmouse 2008-4-18 09:46

2008-04-18 Ruby 测试题(00013)

今天是经典题,汉诺塔。
简单介绍一下背景:开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。
题目要求,针对输入的金片数量N,显示整个搬运过程。
三根金刚石棒分别为A,B,C,初始金片都在A上,最终要求都转移到C上。
输出是这样的:
第1步:A-->B
第2步:A-->C
第1步:C-->B
。。。
。。。

5swords 2008-4-18 10:52

回忆递归中...
**** Hidden Message *****

calebx 2008-4-18 13:32

这不是传说中的,汉诺塔么?

rubylee 2008-4-18 15:18

看一下。。

bbschat 2008-4-18 16:33

虽说是经典问题但一直没空做一下(或者说懒得做)
今天终于有机会了。:lol

**** Hidden Message *****

bbschat 2008-4-18 16:38

回复 2# 的帖子

我觉得次数没必要累加计算,肯定是 2 ** n - 1
直接打印具体搬法就行。

xavier 2008-4-18 17:57

你们都太快了......

idoit 2008-4-20 09:50

学习下。。

jmouse 2008-4-21 09:59

召唤非递归算法

bbschat 2008-4-23 18:51

非递归算法来了

速度虽然慢一点,不过每一步的状况都可以看的很清楚

**** Hidden Message *****

hano2(4)

"A->B"
[[2, 3, 4], [1], []]
"A->C"
[[3, 4], [1], [2]]
"B->C"
[[3, 4], [], [1, 2]]
"A->B"
[[4], [3], [1, 2]]
"C->A"
[[1, 4], [3], [2]]
"C->B"
[[1, 4], [2, 3], []]
"A->B"
[[4], [1, 2, 3], []]
"A->C"
[[], [1, 2, 3], [4]]
"B->C"
[[], [2, 3], [1, 4]]
"B->A"
[[2], [3], [1, 4]]
"C->A"
[[1, 2], [3], [4]]
"B->C"
[[1, 2], [], [3, 4]]
"A->B"
[[2], [1], [3, 4]]
"A->C"
[[], [1], [2, 3, 4]]
"B->C"
[[], [], [1, 2, 3, 4]]

[[i] 本帖最后由 bbschat 于 2008-4-23 19:07 编辑 [/i]]

xl19870805 2008-4-24 15:56

支持,先看下答案咯

boylych 2008-4-24 23:36

郁闷死了,白天想到晚上还是没有想出来,无奈看看答案吧。:( :Q

boylych 2008-4-25 09:28

#主要代码块:
def movehano(n, from, to, tmp)
  if n == 1
    to.push(from.pop)
    return
  end
  
  hano(n - 1, from, tmp, to)
  hano(1, from, to, tmp)
  hano(n - 1, tmp, to, from)
end

#验证:
n = 10
a, b, c = [], [], []

#a = [n, n-1, n-2, ...1]
n.times {|i| a[i] = n - i}

movehano(n, a, c, b)

print "a:", a * "-", "\n"
print "b:", b * "-", "\n"
print "c:", c * "-", "\n"

#上述程序再加上显示移动过程的代码,基本完整了应该。:loveliness:

jmouse 2008-4-28 14:58

另类点的解法[code]def hano(n)
  from = (n % 2 == 0)?3:2
  to = 1
  h=[]
  h[1]=[n+1]
  h[2]=[n+1]
  h[3]=[n+1]
  n.downto(1){|i| h[1]<<i}
  1.upto(2**n-1){|i|
    if i % 2 == 1
      printf "%s->%s\n",(to+64).chr,(6-from-to+64).chr
      h[6-from-to]<<h[to].pop
      from,to=to,(6-from-to)
    else
      if h[from].last < h[6-from-to].last
        printf "%s->%s\n",(from+64).chr,(6-from-to+64).chr
        h[6-from-to]<<h[from].pop
      else
        printf "%s->%s\n",(6-from-to+64).chr,(from+64).chr
        h[from]<<h[6-from-to].pop
      end
    end
  }
end
hano(5)[/code]

zhengdehui 2008-7-26 01:38

**** Hidden Message *****

初次发帖,只记得c++时代的解法了

zhengdehui 2008-7-26 01:39

**** Hidden Message *****

初次发帖,只记得c++时代的解法了

kevin 2008-8-11 21:02

路过,学习一下

acnono 2008-8-21 15:55

**** Hidden Message ***** 我的短 哈哈

[[i] 本帖最后由 acnono 于 2008-8-21 15:56 编辑 [/i]]

punkpopb 2008-10-9 23:09

继续疯狂中,膜拜中!

gavinzhm 2008-10-14 23:25

了解一下~
页: [1]
查看完整版本: 2008-04-18 Ruby 测试题(00013)