Nghĩ về vấn đề này như một vấn đề về cây là một cá trích đỏ, nó thực sự là một biểu đồ có hướng. Nhưng hãy quên tất cả về điều đó.
Hãy nghĩ về một chiếc kính ở bất cứ đâu dưới cái trên cùng. Nó sẽ có một hoặc hai kính phía trên nó có thể tràn vào nó. Với sự lựa chọn phù hợp của hệ tọa độ (đừng lo lắng, hãy xem phần cuối), chúng ta có thể viết một hàm để lấy kính "cha mẹ" cho bất kỳ kính nào.
Bây giờ chúng ta có thể nghĩ về một thuật toán để lấy lượng chất lỏng đổ vào một ly, bất kể tràn ra từ ly đó. Tuy nhiên, câu trả lời là nhiều chất lỏng được đổ vào mỗi phụ huynh trừ đi lượng được lưu trữ trong mỗi ly bố mẹ, chia cho 2. Chỉ cần tính tổng cho tất cả các bậc cha mẹ. Viết cái này như một mảnh trăn của cơ thể của hàm lượng_poured_into ():
# p is coords of the current glass
amount_in = 0
for pp in parents(p):
amount_in += max((amount_poured_into(total, pp) - 1.0)/2, 0)
Tối đa () là để đảm bảo chúng tôi không nhận được số lượng tràn âm.
Chúng tôi sắp hoàn thành! Chúng tôi chọn hệ tọa độ có 'y' xuống trang, kính hàng thứ nhất là 0, hàng thứ hai là 1, v.v ... Các tọa độ 'x' có số 0 dưới kính hàng trên cùng và hàng thứ hai có tọa độ x là -1 và +1, hàng thứ ba -2, 0, +2, v.v. Điểm quan trọng là kính bên trái hoặc bên phải nhất ở cấp y sẽ có abs (x) = y.
Bao bọc tất cả những thứ đó thành python (2.x), chúng ta có:
def parents(p):
"""Get parents of glass at p"""
(x, y) = p
py = y - 1 # parent y
ppx = x + 1 # right parent x
pmx = x - 1 # left parent x
if abs(ppx) > py:
return ((pmx,py),)
if abs(pmx) > py:
return ((ppx,py),)
return ((pmx,py), (ppx,py))
def amount_poured_into(total, p):
"""Amount of fluid poured into glass 'p'"""
(x, y) = p
if y == 0: # ie, is this the top glass?
return total
amount_in = 0
for pp in parents(p):
amount_in += max((amount_poured_into(total, pp) - 1.0)/2, 0)
return amount_in
def amount_in(total, p):
"""Amount of fluid left in glass p"""
return min(amount_poured_into(total, p), 1)
Vì vậy, để có được số tiền thực sự trong một ly tại p, hãy sử dụng lượng_in (tổng, p).
Không rõ ràng từ OP, nhưng bit về "bạn không thể thêm tham số" có thể có nghĩa là câu hỏi ban đầu phải được trả lời theo các số kính được hiển thị. Điều này được giải quyết bằng cách viết một hàm ánh xạ từ các số kính hiển thị sang hệ tọa độ bên trong được sử dụng ở trên. Đó là khó khăn, nhưng một giải pháp lặp hoặc toán học có thể được sử dụng. Một chức năng lặp dễ hiểu:
def p_from_n(n):
"""Get internal coords from glass 'number'"""
for (y, width) in enumerate(xrange(1, n+1)):
if n > width:
n -= width
else:
x = -y + 2*(n-1)
return (x, y)
Bây giờ chỉ cần viết lại hàm số lượng_in () ở trên để chấp nhận số thủy tinh:
def amount_in(total, n):
"""Amount of fluid left in glass number n"""
p = p_from_n(n)
return min(amount_poured_into(total, p), 1)