数学建模社区-数学中国
标题:
python 解决母亲的奶牛问题
[打印本页]
作者:
2744557306
时间:
2024-3-20 11:38
标题:
python 解决母亲的奶牛问题
题目描述】
' a7 A, h9 t% V) e
6 `5 _, I9 f2 o, ^# u0 k P
农夫约翰有三个容量分别为 A,B,C 升的挤奶桶。最开始桶 A 和桶 B 都是空的,而桶 C 里装满了牛奶。有时,约翰会将牛奶从一个桶倒到另一个桶中,直到被倒入牛奶的桶满了或者倒出牛奶的桶空了为止。这一过程中间不能有任何停顿,并且不会有任何牛奶的浪费。请你编写一个程序判断,当 A 桶是空的时候,C桶中可能包含多少升牛奶,找出所有的可能情况。
$ M. a |% N8 H$ A4 w# m6 I
! [4 ^' V8 Y& @. r5 G/ \
【输入格式】
1 [, A$ f! n; o
5 W- k1 [3 f- V
共一行,包含三个整数 A,B,C。
) M# B7 z! X8 w! n: C0 F
7 v8 ]! d- y- c: b$ O3 V7 x
【输出格式】
& U6 g8 F) V0 Z8 Q
: C0 v. B% X6 P7 P; J2 J) v
共一行,包含若干个整数,表示 C 桶中牛奶存量的所有可能情况,请将这些数字按升序排列。
- G" F; k6 Y/ ], o( q1 o# f
. g9 X- M, \, ?$ |; S. N) h
【数据范围】
4 d0 r4 g7 Y: i& S0 m
n1 r7 b+ Z9 G8 J* T* o! d
1≤A,B,C≤20
' }; L* w- p0 ^% s/ e
0 G7 c- S0 B$ o, T, l) U2 B
【输入样例】
/ F, a# X7 s5 r T; G, T
$ w7 I* e0 A" ]: a. b+ s
8 9 10
( G' g0 N1 b: O5 T# s( Q
【输出样例】
, w, V( V+ h1 s/ c8 m( |
' @5 L0 h4 O) Q, R: L$ A
1 2 8 9 10
7 b }" u- R+ E ]2 i7 W" f
【解题思路】
1 P$ _% ~' k8 v+ J9 J; L1 ?
" q( \ t. L9 A! r5 a9 d
BFS简答模拟一下倒牛奶的过程。
from collections import *
8 x: f+ A3 f z4 c7 }
a,b,c = map(int,input().split())
" K, k9 \1 v2 Z. u' g* o" P2 ?$ K$ t
n = 22
/ M( Z' [3 X! Z/ y' d$ R; l3 x. G
st = [[[0 for _ in range(n)] for _ in range(n)] for _ in range(n)]
+ |1 i+ l7 A R" c( C5 q0 ]4 h
, Y" t3 ~. K* n* i+ J
q = deque()
+ x& `) \7 A' Y/ F
def ins(a_,b_,c_):
+ b/ g4 G& Y, G; F6 P2 f
global q
' @4 m- x1 h7 \# ]8 B, p) g/ f
if st[a_][b_][c_]:return
- F7 @3 a. G+ E7 p! a4 \6 Y' Q% O
q.append([a_,b_,c_])
0 d" K5 M1 C A( L
st[a_][b_][c_]=1
+ [9 p0 V4 Z% l8 y% T3 }
def bfs():
, ], F2 D B& \* ^/ T
q.append([0,0,c])
3 Z; Y# F* _% }/ S
st[0][0][c]=1
1 _9 }5 r( q7 w! H
while q:
0 f- j0 |& z0 G h0 l
a_,b_,c_ = q.popleft()
- ]* h' N r \8 k6 m |' v1 S, A
ins( a_-min(a_,b-b_) , b_+min(a_,b-b_) , c_ )
0 N1 Q3 l) H+ N
ins( a_-min(a_,c-c_) , b_ , c_+min(a_,c-c_) )
, ]2 f8 a/ G% o) V w$ s+ l+ j. Q1 E
ins( a_+min(b_,a-a_) , b_-min(b_,a-a_) , c_ )
. y% l& r/ b$ |0 q; `+ I* H# A
ins( a_ , b_-min(b_,c-c_) , c_+min(b_,c-c_) )
( q* k9 O p$ N7 T( M& \* ^7 W$ k
ins( a_+min(c_,a-a_) , b_ , c_-min(c_,a-a_) )
" W9 s, C! K. {) f0 N
ins( a_ , b_+min(c_,b-b_) , c_-min(c_,b-b_) )
5 o4 A7 Z: r0 W. B8 p k' x4 U
bfs()
2 J4 J3 N1 @ ]" k5 @& a
for c_ in range(c+1):
4 |; L2 N$ T: w# F
for b_ in range(b+1):
0 w2 q6 c+ z6 y" C/ I+ C" C
if st[0][b_][c_]:
- G2 n. v9 ]: u' W2 d) d5 l
print(c_,end=' ')
# T& ?0 F: V3 Y9 P0 f( I8 s
break
复制代码
' x! X* J& ^7 K$ P* u; r# Y! ~) t
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5