from collections import deque
def solve_water_jug(c1, c2, target):
queue, visited = deque([(0, 0, [])]), set()
while queue:
j1, j2, path = queue.popleft()
if j1 == target or j2 == target: return path + [(j1, j2)]
if (j1, j2) in visited: continue
visited.add((j1, j2))
queue.extend([(c1, j2, path + [(j1, j2)]), (j1, c2, path + [(j1, j2)]), (0, j2, path + [(j1, j2)]), (j1, 0, path + [(j1, j2)]),
(j1 - min(j1, c2 - j2), j2 + min(j1, c2 - j2), path + [(j1, j2)]),
(j1 + min(j2, c1 - j1), j2 - min(j2, c1 - j1), path + [(j1, j2)])])
return None
# Example usage
c1, c2, target = 4, 3, 2 #Jug 1 capacity: 4, Jug 2 capacity: 3, Target: 2
solution = solve_water_jug(c1, c2, target)
if solution:
for step, (j1, j2) in enumerate(solution):
print(f"Step {step}: Jug1 = {j1}, Jug2 = {j2}")
else:
print("No solution exists.")
'''
Step 0: Jug1 = 0, Jug2 = 0
Step 1: Jug1 = 4, Jug2 = 0
Step 2: Jug1 = 1, Jug2 = 3
Step 3: Jug1 = 1, Jug2 = 0
Step 4: Jug1 = 0, Jug2 = 1
Step 5: Jug1 = 4, Jug2 = 1
Step 6: Jug1 = 2, Jug2 = 3
'''