# coding: utf-8 # ハノイの塔のパズルを解く関数。 # 3本の棒のリストを引数にとり、左端の棒から右端の棒へ最小手数ですべての円盤を # 移してゆく過程を標準出力する。 # 円盤は整数で表し、棒の状態はリストで表す。 # 例えば [[1,2], [], []] は左端の棒に大きさ1と2の円盤2枚が積み上げられており、 # 中央と右端の棒は空いていることを表す。 def hanoi(rods): # 引数startが表す棒から、引数endが表す棒へ、円盤を1枚移す補助関数 def transfer_a_disk(start, end): rods[end].insert(0, rods[start].pop(0)) # 3本の棒にそれぞれ始点、中継点、終点の役割を与え、部分問題に # 分解する際に役割を入れ替えるところが要点 def rec_hanoi(n, start, reray, end): if n == 1: transfer_a_disk(start, end) print rods else: rec_hanoi(n-1, start=start, reray=end, end=reray) transfer_a_disk(start, end) print rods rec_hanoi(n-1, start=reray, reray=start, end=end) # 初期状態の出力と部分問題への分解開始 print rods rec_hanoi(len(rods[0]), start=0, reray=1, end=2) # 左端の棒にn枚の円盤を積み上げた状態の、3本の棒のリストを返す def create_testdata(n): return [range(1, n + 1), [], []] # 実行 hanoi(create_testdata(1)) hanoi(create_testdata(2)) hanoi(create_testdata(3)) hanoi(create_testdata(4))
Standard input is empty
[[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]]