fork(1) download
  1. # coding: utf-8
  2.  
  3. # ハノイの塔のパズルを解く関数。
  4. # 3本の棒のリストを引数にとり、左端の棒から右端の棒へ最小手数ですべての円盤を
  5. # 移してゆく過程を標準出力する。
  6. # 円盤は整数で表し、棒の状態はリストで表す。
  7. # 例えば [[1,2], [], []] は左端の棒に大きさ1と2の円盤2枚が積み上げられており、
  8. # 中央と右端の棒は空いていることを表す。
  9. def hanoi(rods):
  10. # 引数startが表す棒から、引数endが表す棒へ、円盤を1枚移す補助関数
  11. def transfer_a_disk(start, end):
  12. rods[end].insert(0, rods[start].pop(0))
  13.  
  14. # 3本の棒にそれぞれ始点、中継点、終点の役割を与え、部分問題に
  15. # 分解する際に役割を入れ替えるところが要点
  16. def rec_hanoi(n, start, reray, end):
  17. if n == 1:
  18. transfer_a_disk(start, end)
  19. print rods
  20. else:
  21. rec_hanoi(n-1, start=start, reray=end, end=reray)
  22. transfer_a_disk(start, end)
  23. print rods
  24. rec_hanoi(n-1, start=reray, reray=start, end=end)
  25.  
  26. # 初期状態の出力と部分問題への分解開始
  27. print rods
  28. rec_hanoi(len(rods[0]), start=0, reray=1, end=2)
  29.  
  30.  
  31.  
  32. # 左端の棒にn枚の円盤を積み上げた状態の、3本の棒のリストを返す
  33. def create_testdata(n):
  34. return [range(1, n + 1), [], []]
  35.  
  36.  
  37.  
  38. # 実行
  39. hanoi(create_testdata(1))
  40. print
  41. hanoi(create_testdata(2))
  42. print
  43. hanoi(create_testdata(3))
  44. print
  45. hanoi(create_testdata(4))
  46.  
Success #stdin #stdout 0.01s 7728KB
stdin
Standard input is empty
stdout
[[1], [], []]
[[], [], [1]]

[[1, 2], [], []]
[[2], [1], []]
[[], [1], [2]]
[[], [], [1, 2]]

[[1, 2, 3], [], []]
[[2, 3], [], [1]]
[[3], [2], [1]]
[[3], [1, 2], []]
[[], [1, 2], [3]]
[[1], [2], [3]]
[[1], [], [2, 3]]
[[], [], [1, 2, 3]]

[[1, 2, 3, 4], [], []]
[[2, 3, 4], [1], []]
[[3, 4], [1], [2]]
[[3, 4], [], [1, 2]]
[[4], [3], [1, 2]]
[[1, 4], [3], [2]]
[[1, 4], [2, 3], []]
[[4], [1, 2, 3], []]
[[], [1, 2, 3], [4]]
[[], [2, 3], [1, 4]]
[[2], [3], [1, 4]]
[[1, 2], [3], [4]]
[[1, 2], [], [3, 4]]
[[2], [1], [3, 4]]
[[], [1], [2, 3, 4]]
[[], [], [1, 2, 3, 4]]