所有的光所有的光所有的光!


13

在Soulgit Games开发的All Light 启发下,这项挑战已完全消除。

挑战

您是一名电工,将所有灯连接到电池是您的工作。

  • 灯和电池布置在网格中。
  • 您可以将灯或电池连接到最近的灯或电池,将其连接到其北,南,东和西。
  • 电池可以有任意数量的连接。
  • 每个指示灯指定需要多少个连接。你必须准确到光,许多连接。
  • 您可以在两个灯(或灯和电池)之间创建单连接或双连接。
  • 电线不能交叉。
  • 每个灯和电池之间必须有一条路径。
  • 保证至少存在一个有效的解决方案。

给定电池和每个灯的位置以及每个灯所需的连接数,请输出它们之间允许这些属性的连接。

获胜条件

这是,因此每种语言中最短的代码将获胜。

测试用例

I / O像往常一样灵活。

对于输入,我将使用网格大小的二维数组,该数组存储灯光的正整数,空白的零和电池的-1。另一个好的选择可能是灯列表,其中灯是一个包含灯的位置和所需连接数的元组。

对于输出,我将使用连接列表,其中连接是包含开始位置和结束位置的元组。如果连接加倍,则列表中将有2个(另一个选项是在元组中包含此参数)。另一个不错的选择可能是某种网格布局。

如果使用坐标系,则可以指定起始索引以及从中开始索引。我的示例将使用0索引,并使用(0,0)作为左上角(行,列)。(我使用{}只是为了引入另一种定界符,因此更容易阅读,而不是因为它们是集合。)

这是测试用例的图形视图:测试1-12

测试1:

[-1 | 0 | 1 ] => [{(0, 0), (0, 2)}]

测试2:

[-1 | 0 | 2 ] => [{(0, 0), (0, 2)}, {(0, 0), (0, 2)}]

测试3:

[-1 ] [ 0 ] => [{(0, 0), (2, 0)), ((0, 0), (2, 0)}] [ 2 ]

测试4:

[ 1 | 0 |-1 | 0 | 2 ] => [{(0, 0), (0, 2)}, {(0, 2), (0, 4)}, {(0, 2), (0, 4)}]

测试5:

[ 2 ] [ 0 ] [-1 ] => [{(0, 0), (2, 0)}, {(0, 0), (2, 0)}, {(2, 0), (4, 0)}] [ 0 ] [ 1 ]

测试6:

[ 1 | 0 | 0 ] [ 0 | 0 | 0 ] => [{(0, 0), (2, 0)}, {(2, 0), (2, 2)}] [ 2 | 0 |-1 ]

测试7:

[ 4 | 0 | 0 |-1 ] [ 0 | 0 | 0 | 0 ] => [{(0, 0), (0, 3)}, {(0, 0), (0, 3)}, [ 2 | 0 | 0 | 0 ] {(0, 0), (3, 0)}, {(0, 0), (3, 0)}]

测试8:

[ 2 | 0 |-1 | 0 | 2 ] [{(0, 0), (0, 2)}, {(0, 0), (0, 2)}, [ 0 | 0 | 0 | 0 | 0 ] => {(0, 2), (0, 4)}, {(0, 2), (0, 4)}, [ 0 | 0 | 1 | 0 | 0 ] {(0, 2), (2, 2)}]

测试9:

[ 0 | 0 | 2 | 0 | 0 ] [ 0 | 0 | 0 | 0 | 0 ] [ 1 | 0 |-1 | 0 | 1 ] => [{(0, 2), (2, 2)}, {(0, 2), (2, 2)}, {(2, 0), (2, 2)}, [ 0 | 0 | 0 | 0 | 0 ] {(4, 2), (2, 2)}, {(2, 4), (2, 2)}, {(2, 4), (2, 2)}] [ 0 | 0 | 2 | 0 | 0 ]

测试10:

[-1 | 2 | 3 | 2 ] => [{(0, 0), (0, 3)}, {(0, 0), (0, 3)}, {(0, 0), (0, 3)}, {(0, 0), (0, 3)}]

测试11:

[-1 | 0 | 0 | 0 ] [ 3 | 0 | 0 | 0 ] [ 3 | 0 | 0 | 3 ] => [{(0, 0), (1, 0)}, {(1, 0), (2, 0)}, {(1, 0), (2, 0)}, [ 0 | 0 | 0 | 0 ] {(2, 0), (2, 3)}, {(2, 3), (4, 3)}, {(2, 3), (4, 3)}] [ 0 | 0 | 0 | 2 ]

测试12:

[ 2 | 0 | 0 ] [{(0, 0), (1, 0)}, {(0, 0), (1, 0)}, {(1, 0), (1, 1)}, [ 3 |-1 | 0 ] => {(1, 1), (2, 1)}, {(1, 1), (2, 1)}, {(2, 0), (2, 1)}, [ 2 | 5 | 1 ] {(2, 0), (2, 1)}, {(2, 1), (2, 2)}]



我建议使用一个测试用例,使存在的解决方案满足所有条件,但“必须有一条从每个灯到电池的路径”。例如[1 | -1] [1 1]
user202729 '18

某种程度上让我想起了Blossom算法。
user202729 '18

2
@ user202729我保证输入具有满足所有条件的解决方案
musicman523 '18

1
这似乎类似于哈希难题。我认为解决这两个问题的许多相同步骤都是相同的。
世纪

Answers:


2

的JavaScript(Node.js的)393个 391 378字节

a=>(R=[],f=(a,[x,...y],z,Y)=>x?f(a.map(t=>[...t]),y,z,Y)||f(a,y,[...z,x],Y.map(p=>p.map(q=>q-Y[x[0]][x[1]]?q:Y[x[2]][x[3]])),--a[x[0]][x[1]],--a[x[2]][x[3]]):/[1-9]/.test(a)|Y.some(t=>t.some(u=>u-Y[I][J]&&u))?0:z)(a=a.map(A=(b,i)=>b.map((x,j)=>x&&(A[i]+1&&R.push([i,A[i],i,j]),f[j]+1&&R.push([f[j],j,i,j]),A[I=i]=j,f[J=j]=i,x/=x>0))),[...R,...R],C=[],a.map(p=>p.map(q=>q&&++C)))

在线尝试!

a=>(
    a=a.map(
        A=(b,i)=>
            b.map(
                (x,j)=>
                    x&&(                                  // A[i]+1 <==> A[i] is NOT NaN
                        A[i]+1&&R.push([i,A[i],i,j]),     // Use A and f to store last
                        f[j]+1&&R.push([f[j],j,i,j]),     // existance of row and column
                        A[I=i]=j,f[J=j]=i,x/=x>0          // -1 => -Inf, +n => n
                    )
            ),
            R=[],
            f=([x,...y],z,Y)=>
                x?
                    f(
                        y,[...z,x],
                        Y.map(p=>p.map(q=>q-Y[x[0]][x[1]]?q:Y[x[2]][x[3]])), // merge
                        --a[x[0]][x[1]],--a[x[2]][x[3]]
                    )||
                    f(y,z,Y,++a[x[0]][x[1]],++a[x[2]][x[3]])
                :
                    /[1-9]/.test(a)|
                    Y.some(t=>t.some(u=>u-Y[I][J]&&u)) // not totally merged
                    ?0:z
    ),f)([...R,...R],[],a.map(p=>p.map(q=>q&&++C),C=0)
)


JavaScript RegEx中是否有/ [1-9] /的快捷方式?
扎卡里

@Zacharý我不这么认为。通常[0-9]使用
l4m2

傻我!我以为这是你写的东西
扎卡里

@Zacharý什么?
l4m2 '18年
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.