ハノイの塔 at Python
ハノイの塔をPythonで書いた。
スタックで各棒の状態も持たせるようにしたので、Stackクラスも書いたけど、
解くだけなら別にいらない。
class Stack(object): item = [] name = "" def __init__(self): self.item = [] self.name = "" def push(self, data): self.item.append(data) def pop(self): if len(self.item) == 0: raise ValueError("item is null") data = self.item[-1] self.item.pop(-1) return data def peek(self): if len(self.item) == 0: return None return self.item[-1] def naming(self, name): self.name = name def __repr__(self): return self.name class Hanoi(object): disk_number = 0 stack_a = Stack() stack_a.naming("a") stack_b = Stack() stack_b.naming("b") stack_c = Stack() stack_c.naming("c") def __init__(self, n): """ :param n:number of disks """ self.disk_number = n disks = reversed(range(n)) for i in disks: self.stack_a.push(i) def solve(self): self.move(self.disk_number, self.stack_a, self.stack_c, self.stack_b) def move(self, n, from_s, to_s, tmp_s): if(n > 1): self.move(n-1, from_s, tmp_s, to_s) print("disk{0}:{1}->{2}".format(n, from_s, to_s)) disk = from_s.peek() from_s.pop() to_s.push(disk) self.move(n-1, tmp_s, to_s, from_s) elif(n == 1): print("disk{0}:{1}->{2}".format(n, from_s, to_s)) disk = from_s.peek() from_s.pop() to_s.push(disk) hanoi = Hanoi(3) hanoi.solve()