เมื่อคิดว่านี่เป็นปัญหาต้นไม้เป็นปลาเฮอริ่งแดงมันเป็นกราฟกำกับ แต่ลืมไปเลยว่า
ลองนึกถึงแก้วทุกแก้วที่อยู่ใต้กระจกชั้นบน มันจะมีหนึ่งหรือสองแก้วด้านบนที่สามารถล้นได้ ด้วยทางเลือกที่เหมาะสมของระบบพิกัด (ไม่ต้องกังวลดูจุดสิ้นสุด) เราสามารถเขียนฟังก์ชั่นเพื่อรับแว่นตา "หลัก" สำหรับแก้วใดก็ได้
ตอนนี้เราสามารถคิดเกี่ยวกับอัลกอริทึมเพื่อให้ได้ปริมาณของเหลวที่เทลงในแก้วโดยไม่คำนึงถึงการไหลล้นจากแก้วนั้น คำตอบคืออย่างไรก็ตามของเหลวจำนวนมากถูกเทลงในผู้ปกครองแต่ละคนลบจำนวนที่เก็บไว้ในแก้วผู้ปกครองแต่ละหารด้วย 2 เพียงผลรวมที่พ่อแม่ทุกคน เขียนสิ่งนี้เป็นส่วนหลามของเนื้อหาของฟังก์ชั่น amount_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)
จำนวนสูงสุด () คือเพื่อให้แน่ใจว่าเราจะไม่ได้รับจำนวนเงินที่ล้นเกิน
ใกล้เสร็จแล้ว! เราเลือกระบบพิกัดที่มี 'y' ลงมาหน้าแว่นตาแถวแรกคือ 0, แถวที่สองคือ 1 เป็นต้นพิกัด 'x' มีศูนย์ใต้กระจกแถวบนสุดและแถวที่สองมีพิกัด x -1 และ +1, แถวที่สาม -2, 0, +2 และอื่น ๆ จุดสำคัญคือแก้วซ้ายหรือขวาสุดในระดับ y จะมี abs (x) = y
การตัดทั้งหมดที่เป็น python (2.x) เรามี:
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)
ดังนั้นเพื่อให้ได้จำนวนจริงในแก้วที่ p ให้ใช้จำนวน _ ใน (ทั้งหมด, p)
มันไม่ชัดเจนจาก OP แต่บิตเกี่ยวกับ "คุณไม่สามารถเพิ่มพารามิเตอร์" อาจหมายถึงคำถามเดิมจะต้องตอบในแง่ของตัวเลขแก้วที่แสดง นี่คือการแก้ไขโดยการเขียนฟังก์ชั่นการทำแผนที่จากหมายเลขกระจกแสดงไปยังระบบพิกัดภายในที่ใช้ข้างต้น มันเป็นเรื่องตลก แต่สามารถใช้วิธีแก้ซ้ำหรือทางคณิตศาสตร์ได้ ฟังก์ชั่นวนซ้ำง่ายต่อการเข้าใจ:
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)
ตอนนี้เพียงแค่เขียนฟังก์ชัน amount_in () ด้านบนเพื่อรับหมายเลขแก้ว:
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)