読者です 読者をやめる 読者になる 読者になる

ポーカー、プログラミング、もぐ

ポーカーとプログラミングともぐもぐについてのブログ。

ハノイの塔 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()