एक पेड़ की समस्या के रूप में इस बारे में सोचना एक रेड-हेरिंग है, यह वास्तव में एक निर्देशित ग्राफ है। लेकिन यह सब भूल जाओ।
ऊपर के नीचे कहीं भी एक ग्लास के बारे में सोचो। इसके ऊपर एक या दो ग्लास होंगे जो इसमें ओवरफ्लो कर सकते हैं। समन्वय प्रणाली के उचित विकल्प के साथ (चिंता न करें, अंत देखें) हम किसी भी दिए गए ग्लास के लिए "माता-पिता" चश्मा प्राप्त करने के लिए एक फ़ंक्शन लिख सकते हैं।
अब हम एक ग्लास में डाले गए तरल की मात्रा प्राप्त करने के लिए एक एल्गोरिथ्म के बारे में सोच सकते हैं, चाहे उस ग्लास से ओवरफ्लो हो। हालांकि इसका जवाब है कि प्रत्येक माता-पिता ग्लास में संग्रहीत राशि को प्रत्येक माता-पिता माइनस में डालते हैं, 2. सभी योगों के लिए। यह एक राशि के शरीर के अजगर टुकड़े के रूप में लिख रहा है_पूर्वी_इंटो () फ़ंक्शन:
# 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' निर्देशांक में शीर्ष पंक्ति के ग्लास के नीचे एक शून्य है और दूसरी पंक्ति में -1 का x निर्देशांक है। +1, तीसरी पंक्ति -2, 0, +2, और इसी तरह। महत्वपूर्ण बिंदु यह है कि लेवल y में लेफ्ट या राइट-मोस्ट ग्लास में abs (x) = y होगा।
अजगर (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)
इसलिए राशि को वास्तव में पी में एक गिलास में प्राप्त करने के लिए, राशि_ का उपयोग करें (कुल, पी)।
यह ओपी से स्पष्ट नहीं है, लेकिन के बारे में "आप नहीं कर सकते पैरामीटर जोड़" बिट मूल प्रश्न कांच के मामले में जवाब हो गया है मतलब हो सकता है नंबर दिखाया गया है। यह शो ग्लास नंबरों से ऊपर इस्तेमाल किए गए आंतरिक समन्वय प्रणाली में एक मैपिंग फ़ंक्शन लिखकर हल किया जाता है। यह फिडली है, लेकिन या तो एक पुनरावृत्त या गणितीय समाधान का उपयोग किया जा सकता है। पुनरावृत्त समारोह को समझने में आसान:
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)
अब बस एक ग्लास नंबर को स्वीकार करने के लिए उपरोक्त राशि_ () फ़ंक्शन को फिर से लिखें:
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)