이것을 트리 문제로 생각하는 것은 붉은 청어입니다. 그것은 실제로 방향 그래프입니다. 그러나 그것에 대해 모든 것을 잊어라.
상단 유리 아래 어디에서나 유리를 생각하십시오. 오버플로 될 수있는 하나 이상의 유리가 위에있을 것입니다. 적절한 좌표 시스템을 선택하면 (걱정하지 말고 끝을 참조하십시오) 우리는 주어진 유리에 대해 "부모"안경을 얻는 기능을 작성할 수 있습니다.
이제 유리의 오버플로에 관계없이 유리에 액체의 양을 붓는 알고리즘을 생각할 수 있습니다. 그러나 대답은 많은 양의 액체를 각 모 유리에 저장된 양에서 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)
max ()는 음의 오버플로를 얻지 않도록하는 것입니다.
거의 끝났습니다! 페이지 아래에 'y', 첫 번째 행 안경은 0, 두 번째 행은 1 등의 좌표계를 선택합니다. 'x'좌표는 상단 행 글래스 아래에 0이 있고 두 번째 행에는 x 좌표가 -1이고 +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)
따라서 실제로 p에서 유리의 양을 얻으려면 amount_in (total, 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)