6 각형 막대 덮개에서 유지되는 물


22

나는 육각형 막대가 이상한 조각으로 붙어 있습니다. 막대의 길이는 1 ~ 99 센티미터 (cm)이고 단면적은 1 평방 cm입니다. 모든 막대는 6 각형면에 하나 이상의 다른 막대에 접착됩니다. 막대는 모두 아래쪽 가장자리에 정렬됩니다.

약간의 비가 내린 후 조각품에는 물이 가득합니다. 물을 얼마나 많이 보유하고 있습니까?

입력

프로그램은 stdin 또는 파일을 통해 막대의 길이를 지정하는 공백 쌍과 숫자 쌍으로 구성된 여러 행을 다음 형식으로 읽어야합니다.

  aa  bb
cc  dd  ee
  ff  gg

각로드 (여기서 dd와 같은)는 예제에 표시된대로 최대 6 개의 주변로드에 접착됩니다. 빠진 막대는 구멍이며 물을 모으지 않습니다. 예를 들어, 입력

  04  04
04  01  03
  04  04

다음 조각을 나타냅니다.

여기에 이미지 설명을 입력하십시오

중앙 막대는 높이입니다 1(그 막대가 보이는 곳에서 좋은 각도를 찾지 못했습니다). 이제 그 막대 위의 기둥이 2cm의 물을 담을 수 있었으며 3, 오른쪽 막대 위에 넘치게되었습니다 . 다른 막대 중 어느 것도 그 위에 물을 담을 수 없으므로 대답은입니다 2. 다음은 더 복잡한 두 가지 예입니다.

Example 2:
55  34  45  66
  33  21  27
23  12  01  77
  36  31  74
answer = 35 (  2 on top of 21 
             +11 on top of 12
             +22 on top of 01, before everything overflows over 23)

Example 3:
        35  36  77  22                      23  32  54  24
      33  07  02  04  21                  54  07  07  07  76
    20  04  07  07  01  20              54  11  81  81  07  76
  20  67  67  22  07  01  78          54  07  81  07  81  09  76
20  67  07  67  22  22  07  44  55  54  07  81  07  07  61  07  20
  67  57  50  50  07  07  14  03  02  15  81  99  91  07  81  04
67  07  50      50  87  39  45  41  34  81  07  07  89  07  81  79
  67  07  50  50  07  07  07  27  07  27  81  07  07  79  81  78
20  67  67  07  07  07  07  99  33  46  02  81  07  07  81  01  20
  33  07  07  01  05  01  92          20  02  81  07  81  15  32
    22  07  20  20  07  20              63  02  80  81  15  32
      45  20  01  20  39                  20  15  07  15  32
        23  20  20  29  43  21  18  41  20  66  66  43  21
      90                  99  47  07  20
    50                      20  02  48
  70                          56  20
                                90

answer = 1432

산출

프로그램은 물의 부피를 세제곱 센티미터로 제공하는 단일 정수를 출력해야합니다.

점수

점수는 소스 코드의 바이트 수입니다. 최저 승.

표준 허점은 평소와 같이 금지되어 있습니다.

이 퍼즐은 SPOJ Question 에서 영감을 받았습니다 .


4
처음 두 번 읽었을 때 이것을 시각화하는 데 어려움이 있었으므로 첫 번째 예제에 대한 다이어그램과 설명을 추가 할 자유가있었습니다. 당신이 상관하지 않기를 바랍니다.
Martin Ender

이것은 물로 채워지는 모양과 관련된 다른 문제와 실제로 유사합니다.
FUZxxl

2
@ FUZxxl 우리는 그런 다른 도전이 있습니까?
Optimizer

1
@ FUZxxl 나는 이 도전 만 기억 합니다 . 매우 다릅니다.
Martin Ender

@Optimizer 이것은 다소 비슷합니다.
Zgarb

답변:


4

파이썬 2, 222 바이트

import sys
y=h=v=0;B={}
for l in sys.stdin:
 z=y;y+=2j
 while l:
    if"0"<l:B[z]=int(l[:2])
    l=l[2:];z+=1
while B:C=B;B={b:B[b]for b in B if(h<B[b])+sum(3>abs(c-b)for c in B)/7};a=C==B;h+=a;v+=a*sum(h>B[b]for b in B)
print v

STDIN을 통해 입력을 읽고 결과를 STDOUT에 씁니다.

설명

우리는 0에서 시작하여 다음과 같이 수위를 점차적으로 증가시킵니다. h 1 센티미터의 물을 추가하려고합니다. 우리는 높이가 h 이하인 육각형을 수중으로 가거나 이미 잠수 한 육각형이라고 합니다. 물은 6 개의 이웃으로 둘러싸이지 않은 수중 육각형을 통해 쏟아 질 것입니다. 우리는 그러한 모든 육각형을 제거합니다. 물론, 이제 일부 다른 수중 육각형은 6 개 미만의 이웃을 가질 수 있으며 또한 제거해야합니다. 우리는 수렴 할 때까지, 즉 남아있는 모든 잠긴 육각형에 정확히 6 개의 이웃이있을 때까지이 방식으로 계속합니다. 이 시점에서 우리는 침수 된 육각형 수 (이득 된 물량)를 총 수에 더하고 수위를 증가시킵니다.

결국, 모든 육각형이 제거되고 우리는 멈출 것입니다.


-3<c-b<3 대신을 사용하여 캐릭터를 면도 할 수 있어야합니다 3>abs(c-b).
DLosc

@DLosc Ah, 그러나 그것들은 복소수입니다;)
Ell

매혹적인. 그것을 잡지 못했습니다.
DLosc

2

루비 299

f=->i{s={}
l=i.lines
y=0
l.map{|r|x=0
r.scan(/../){s[[x,y]]=[v=$&.to_i,v<1?0:99];x+=1}
y+=1}
loop{break if s.map{|c,r|x,y=c
m = [[-1,-1],[1,-1],[-2,0],[2,0],[1,-1],[1,1]].map{|w,z|s[[x+w,y+z]]}.map{|n|n ?n[0]+n[1]:0}.min
r[1]=[0,m-r[0]].max if r[0]+r[1]>m&&r[1]>0}.none?}
s.map{|c,r|r[1]}.reduce :+}

알고리즘에 대한 간단한 설명 :

  • 입력을 구문 분석하고 각 막대에 대해 [rod_height, water_height] 형식의 2 요소 배열을 저장합니다.
  • 막대는 해시에 배치되고 x, y 좌표로 색인됩니다.
  • 누수 부분은 바로 인접한 이웃의 막대 / 물 높이를 고려합니다.

약간 더 읽기 쉬운 버전이 여기에 있습니다 : http://ideone.com/cWkamV

테스트를 통해 온라인으로 골프 버전을 실행하십시오 : http://ideone.com/3SFjPN


scan블록 인수를 취합니다. 당신은 그냥 할 수있다 scan(/../){...}. 대신 (/../) 스캔 '의지도 {| V | ...} . (You don't need the | V |`인사이드 때문에 scan당신이 할 수있는 블록 $&, $1등)
요르단

@ 조던 위대한 관찰! 감사!
Cristian Lupascu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.