|
2 | 2 | print("TOWER OF HANOI") |
3 | 3 | print("=" * 50) |
4 | 4 |
|
| 5 | +def display_towers(towers): |
| 6 | + print(f"Tower A: {towers['A']}") |
| 7 | + print(f"Tower B: {towers['B']}") |
| 8 | + print(f"Tower C: {towers['C']}") |
| 9 | + |
| 10 | +def move_disk(towers, source, destination): |
| 11 | + source_tower = towers[source] |
| 12 | + dest_tower = towers[destination] |
| 13 | + |
| 14 | + if not source_tower: |
| 15 | + print(f"Invalid move! Tower {source} is empty.") |
| 16 | + return None |
| 17 | + disk = source_tower[-1] |
| 18 | + |
| 19 | + if dest_tower and dest_tower[-1] < disk: |
| 20 | + print("Invalid move! Cannot place larger disk on smaller disk.") |
| 21 | + return None |
| 22 | + disk = source_tower.pop() |
| 23 | + dest_tower.append(disk) |
| 24 | + return disk |
| 25 | + |
| 26 | + |
5 | 27 | while True: |
6 | 28 | try: |
7 | 29 | n = int(input("\nEnter the number of disks (1-8): ")) |
|
12 | 34 | except ValueError: |
13 | 35 | print("Please enter a valid number!") |
14 | 36 |
|
| 37 | + |
15 | 38 | tower_A = list(range(n, 0, -1)) |
16 | 39 | tower_B = [] |
17 | 40 | tower_C = [] |
18 | 41 |
|
| 42 | +towers = { |
| 43 | + 'A': tower_A, |
| 44 | + 'B': tower_B, |
| 45 | + 'C': tower_C |
| 46 | +} |
| 47 | + |
19 | 48 | stack = [(n, 'A', 'C', 'B')] |
20 | 49 | move_count = 0 |
21 | 50 |
|
22 | 51 | print(f"\nSolving Tower of Hanoi with {n} disks...") |
23 | 52 | print("Moving from Tower A to Tower C using Tower B as auxiliary") |
24 | 53 | print("\nInitial State:") |
25 | | -print(f"Tower A: {tower_A}") |
26 | | -print(f"Tower B: {tower_B}") |
27 | | -print(f"Tower C: {tower_C}") |
| 54 | +display_towers(towers) |
28 | 55 | print("\n" + "=" * 50) |
29 | 56 |
|
30 | 57 | while stack: |
31 | 58 | disks, source, destination, auxiliary = stack.pop() |
32 | | - |
33 | 59 | if disks == 1: |
34 | | - move_count += 1 |
35 | | - |
36 | | - if source == 'A': |
37 | | - source_tower = tower_A |
38 | | - elif source == 'B': |
39 | | - source_tower = tower_B |
40 | | - else: |
41 | | - source_tower = tower_C |
42 | | - |
43 | | - if destination == 'A': |
44 | | - dest_tower = tower_A |
45 | | - elif destination == 'B': |
46 | | - dest_tower = tower_B |
47 | | - else: |
48 | | - dest_tower = tower_C |
49 | | - |
50 | | - disk = source_tower.pop() |
51 | | - dest_tower.append(disk) |
52 | | - |
53 | | - print(f"Move {move_count}: Move disk {disk} from Tower {source} to Tower {destination}") |
54 | | - print(f"Tower A: {tower_A}") |
55 | | - print(f"Tower B: {tower_B}") |
56 | | - print(f"Tower C: {tower_C}") |
57 | | - print("-" * 50) |
| 60 | + disk = move_disk(towers, source, destination) |
| 61 | + if disk is not None: |
| 62 | + move_count += 1 |
| 63 | + |
| 64 | + print( |
| 65 | + f"Move {move_count}: Move disk {disk} " |
| 66 | + f"from Tower {source} to Tower {destination}" |
| 67 | + ) |
| 68 | + display_towers(towers) |
| 69 | + print("-" * 50) |
| 70 | + |
58 | 71 | else: |
59 | 72 | stack.append((disks - 1, auxiliary, destination, source)) |
60 | | - |
61 | 73 | stack.append((1, source, destination, auxiliary)) |
62 | | - |
63 | 74 | stack.append((disks - 1, source, auxiliary, destination)) |
64 | 75 |
|
65 | 76 | print("\n" + "=" * 50) |
|
0 commit comments