70 lines
1.9 KiB
Python
70 lines
1.9 KiB
Python
from collections import deque
|
|
|
|
|
|
def bfs(capacities, target):
|
|
# 初始化队列和访问过的状态集合
|
|
queue = deque([(0, 0, 0)]) # 三个桶的初始状态
|
|
visited = set([(0, 0, 0)])
|
|
|
|
# 操作步骤计数
|
|
steps = 0
|
|
|
|
# 开始BFS搜索
|
|
while queue:
|
|
for _ in range(len(queue)):
|
|
current_state = queue.popleft()
|
|
a, b, c = current_state
|
|
|
|
# 如果找到目标状态
|
|
if target in current_state:
|
|
return steps
|
|
|
|
# 获取当前桶的容量
|
|
A, B, C = capacities
|
|
|
|
# 对每一对桶进行操作
|
|
next_states = [
|
|
# 倒水操作:将水从一个桶倒入另一个桶
|
|
# 从a桶倒到b桶
|
|
(min(a + b, B), max(0, a + b - B), c),
|
|
# 从a桶倒到c桶
|
|
(min(a + c, C), b, max(0, a + c - C)),
|
|
# 从b桶倒到a桶
|
|
(min(a + b, A), max(0, a + b - A), c),
|
|
# 从b桶倒到c桶
|
|
(a, min(b + c, C), max(0, b + c - C)),
|
|
# 从c桶倒到a桶
|
|
(min(a + c, A), b, max(0, a + c - A)),
|
|
# 从c桶倒到b桶
|
|
(a, min(b + c, B), max(0, b + c - B)),
|
|
# 清空每个桶
|
|
(0, b, c),
|
|
(a, 0, c),
|
|
(a, b, 0),
|
|
# 将每个桶填满
|
|
(A, b, c),
|
|
(a, B, c),
|
|
(a, b, C)
|
|
]
|
|
|
|
# 遍历所有新状态
|
|
for state in next_states:
|
|
if state not in visited:
|
|
visited.add(state)
|
|
queue.append(state)
|
|
|
|
# 增加操作次数
|
|
steps += 1
|
|
|
|
return -1 # 如果找不到目标
|
|
|
|
|
|
# 容器的容量
|
|
capacities = [160, 119, 77]
|
|
# 目标水量
|
|
target = 76
|
|
|
|
# 求解最少操作次数
|
|
result = bfs(capacities, target)
|
|
print("最少操作次数:", result)
|