Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from collections import namedtuple
- from collections import UserList
- # Total moves is 2**N-1 where N is the tower height
- class HanoiTower:
- Disk = namedtuple('Disk', ['size'])
- class Tower(UserList):
- def __init__(self, data=[], *, name):
- self.data = data
- self.name = name
- def __init__(self, quantity: int=3):
- init_tower = [self.Disk(i) for i in range(quantity, 0, -1)]
- self.left = self.Tower(init_tower, name='A')
- self.mid = self.Tower(name='B')
- self.right = self.Tower(name='C')
- self.quantity = quantity
- self.history = []
- self.solved = False
- def solve(self):
- if not self.solved:
- self._move_tower(self.quantity,
- self.left,
- self.right,
- self.mid)
- self.solved = True
- def _move_tower(self,
- height: int,
- source: list,
- dest: list,
- mid: list):
- if height == 1:
- disk = source.pop()
- dest.append(disk)
- record = f"Move {disk} from {source.name} to {dest.name}"
- self.history.append(record)
- else:
- self._move_tower(height - 1, source, mid, dest)
- self._move_tower(1, source, dest, mid)
- self._move_tower(height - 1, mid, dest, source)
- def print_history(self):
- for line in self.history:
- print(line)
- print(f"Total moves: {len(self.history)}")
- if __name__ == '__main__':
- tower = HanoiTower(10)
- tower.solve()
- tower.print_history()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement