python-archieve-projects/ChatLLM/water_bucket.py

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)