六角棒中的水


22

我有一堆六角棒粘在一起,成为一个奇怪的雕塑。棒长1至99厘米(cm),横截面积为1平方厘米。所有的杆都在六角面上粘贴到至少另一个杆上。杆都在其底部边缘对齐。

一阵大雨后,雕塑里充满了水。它容纳多少水?

输入项

您的程序应(通过stdin或文件)读入多行,这些行由成对的空格和成对的数字组成,以这种格式指定标尺的长度:

  aa  bb
cc  dd  ee
  ff  gg

如示例中所示,每个杆(如此处的dd)最多可粘到6个周围的杆上。缺少杆是孔,不会积水。例如,输入

  04  04
04  01  03
  04  04

将代表以下雕塑:

在此处输入图片说明

中心杆是高度1(在该杆也可见的地方,我找不到合适的角度)。现在,该杆上方的柱子可以容纳2 cm的水,然后才能溢出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问题启发的 。


4
在阅读前两次时,我很难看到它,因此我自由地添加了一个图,并为第一个示例添加了更多说明。希望你不要介意。
马丁·恩德

这确实与涉及填充水的形状的其他挑战相似。
FUZxxl

2
@FUZxxl我们还有其他挑战吗?
Optimizer

1
@FUZxxl我只记得这个挑战,这是非常不同的。
马丁·恩德

@Optimizer 有点相似。
Zgarb'3

Answers:


4

Python 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。

说明

我们从零开始,并按如下方式递增水位:假设水位为h,我们想添加1厘米水。我们将高度为h或更小的六边形(即将要(或已经)在水下的那些)称为“ 浸没式”。水会从没有被六个邻居包围的所有浸入水中的六角形中溢出。我们消除了所有这些六边形;当然,现在其他淹没的六边形可能少于六个,并且也需要将其消除。我们以这种方式继续进行,直到收敛为止,即直到所有剩余的浸入六边形都恰好有六个邻居。此时,我们将淹没六边形的数量(获得的水量)添加到总数中,并增加水位。

最终,所有六边形都将被消除,我们停止了。


您应该可以使用-3<c-b<3 代替刮胡子3>abs(c-b)
DLosc

@DLosc啊,但是它们是复数;)
2015年

迷人。没有抓住。
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]的两元素数组
  • 杆放置在哈希中,并通过其x,y坐标进行索引
  • 漏水部分考虑了附近邻居的鱼竿/水高

此处提供了更具可读性的版本:http : //ideone.com/cWkamV

通过测试在线运行高尔夫版本:http ://ideone.com/3SFjPN


scan接受一个块参数。你可以做scan(/../){...},而不是“扫描(/../)映射{| V | ...} . (You don't need the | V |`因为里面的scan块就可以$&$1等)
乔丹

@乔丹的伟大观察!谢谢!
Cristian Lupascu '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.