# ハノイの塔の状態を追跡するクラス
class Hanoi
attr_accessor :rods
# 初期化メソッド
def initialize(n)
@n = n
@rods = { "A" => (1..n).to_a.reverse, "B" => [], "C" => [] }
end
# ディスクの移動メソッド
def move_disk(from, to)
disk = @rods[from].pop
@rods[to].push(disk)
end
# ハノイの塔の再帰的な解法
def solve_hanoi(n, from, to, aux, t, move_count)
return move_count if move_count >= t
if n == 1
move_disk(from, to)
move_count += 1
return move_count if move_count >= t
else
move_count = solve_hanoi(n - 1, from, aux, to, t, move_count)
return move_count if move_count >= t
move_disk(from, to)
move_count += 1
return move_count if move_count >= t
move_count = solve_hanoi(n - 1, aux, to, from, t, move_count)
end
move_count
end
# ハノイの塔をt回移動させるメソッド
def simulate(t)
solve_hanoi(@n, "A", "C", "B", t, 0)
end
# 各杭の状態を出力するメソッド
def print_rods
@rods.each_value do |rod|
if rod.empty?
puts "-"
else
puts rod.join(" ")
end
end
end
end
# メイン処理
if __FILE__ == $0
n, t = gets.split.map(&:to_i)
hanoi = Hanoi.new(n)
hanoi.simulate(t)
hanoi.print_rods
end
解説
-
ハノイの塔の状態を追跡するクラス
class Hanoi attr_accessor :rods
-
Hanoi
クラスはハノイの塔の状態を追跡します。@rods
変数は各杭の状態を保持します。
-
-
初期化メソッド
def initialize(n) @n = n @rods = { "A" => (1..n).to_a.reverse, "B" => [], "C" => [] } end
- 初期化メソッドでは、円盤の数
n
を設定し、@rods
ハッシュに各杭の初期状態を設定します。Aの杭には1からnまでの円盤が大きい順に積まれています。
- 初期化メソッドでは、円盤の数
-
ディスクの移動メソッド
def move_disk(from, to) disk = @rods[from].pop @rods[to].push(disk) end
-
move_disk
メソッドは指定された杭from
からto
に円盤を移動します。
-
-
ハノイの塔の再帰的な解法
def solve_hanoi(n, from, to, aux, t, move_count) return move_count if move_count >= t if n == 1 move_disk(from, to) move_count += 1 return move_count if move_count >= t else move_count = solve_hanoi(n - 1, from, aux, to, t, move_count) return move_count if move_count >= t move_disk(from, to) move_count += 1 return move_count if move_count >= t move_count = solve_hanoi(n - 1, aux, to, from, t, move_count) end move_count end
-
solve_hanoi
メソッドはハノイの塔の再帰的な解法です。円盤を目的の回数t
まで移動します。move_count
は現在の移動回数を追跡します。
-
-
ハノイの塔をt回移動させるメソッド
def simulate(t) solve_hanoi(@n, "A", "C", "B", t, 0) end
-
simulate
メソッドはsolve_hanoi
メソッドを呼び出し、円盤をt回移動させます。
-
-
各杭の状態を出力するメソッド
def print_rods @rods.each_value do |rod| if rod.empty? puts "-" else puts rod.join(" ") end end end
-
print_rods
メソッドは各杭の状態を出力します。空の杭は"-"
と表示されます。
-
-
メイン処理
if __FILE__ == $0 n, t = gets.split.map(&:to_i) hanoi = Hanoi.new(n) hanoi.simulate(t) hanoi.print_rods end
- メイン処理部分では、標準入力から
n
とt
を取得し、Hanoi
クラスを使用して円盤をt回移動させた後、各杭の状態を出力します。
- メイン処理部分では、標準入力から