This repository was archived by the owner on Mar 15, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathtwo_bucket.py
More file actions
49 lines (39 loc) · 1.46 KB
/
Copy pathtwo_bucket.py
File metadata and controls
49 lines (39 loc) · 1.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
def measure(bucket1, bucket2, goal, start_bucket):
if start_bucket == "one":
liter1 = bucket1
liter2 = 0
elif start_bucket == "two":
liter1 = 0
liter2 = bucket2
return bfs(bucket1, bucket2, liter1, liter2, goal, start_bucket)
def bfs(bucket1, bucket2, liter1, liter2, goal, start_bucket):
states = [(liter1, liter2)]
seen = set()
move_count = 1
while states != []:
new_states = []
for liter1, liter2 in states:
if liter1 == goal:
return (move_count, "one", liter2)
elif liter2 == goal:
return (move_count, "two", liter1)
for liter1, liter2 in move(bucket1, bucket2, liter1, liter2):
if start_bucket == "one" and liter1 == 0 and liter2 == bucket2:
continue
if start_bucket == "two" and liter2 == 0 and liter1 == bucket1:
continue
if (liter1, liter2) not in seen:
new_states.append((liter1, liter2))
seen.add((liter1, liter2))
states = new_states
move_count += 1
return None
def move(bucket1, bucket2, liter1, liter2):
return [
(0, liter2),
(liter1, 0),
(bucket1, liter2),
(liter1, bucket2),
(max(liter1 + liter2, bucket2) - bucket2, min(liter1 + liter2, bucket2)),
(min(liter1 + liter2, bucket1), max(liter1 + liter2, bucket1) - bucket1)
]