粘液霉菌可以指望!


10

背景

粘液霉菌真棒。如果将它们放在有食物来源的表面上,它们将蔓延其卷须以寻找食物,然后它们在来源之间形成连接网络。在此挑战中,您将模拟一个黏液模具来寻找食物。而且,一旦找到足够的模具,该模具将停止。

输入值

您的输入应为使用L语言的本机格式的2D整数坐标列表,以及非负整数N。该列表L保证不会重复,但是可能无法排序。输入N介于0和的长度(L含)之间。

该列表L代表了一组食物来源坐标。例如清单

[(0,0),(2,-1),(3,1),(0,4),(5,5)]

可以在视觉上解释为

     o
o


   o
o
  o

输出量

您的输出是另一个K2D整数坐标的无重复列表,其格式与输入相同。它代表由粘液模具形成的网络,并且应满足以下条件:

  • 的交点LK具有大小完全相同N
  • 该集合K作为整数网格的子集连接(通过正交或对角线邻接)。
  • 如果K移除了的任何坐标,则它不再满足前两个条件。

请注意,如果N = 0,输出必须为空列表。

用于上述列表中的可接受的输出的一个例子LN = 4

[(0,0),(0,1),(0,2),(0,3),(0,4),(1,4),(2,4),(3,3),(3,2),(3,1),(3,5),(4,5),(5,5)]

可以可视化为

   xxO
Oxx
x  x
x  x
x  O
O
  o

其中,每个O代表一个在两个坐标LK,并且每个x代表一个坐标中K而不是在L。其他输出也是可以接受的,“卷轴”不必尽可能短。例如,这也是可接受的解决方案:

   xxOxx
Oxx     x
  x    x
 x    x
x  o x
O   x
  Ox 

规则

输入和输出都应该是列表,而不是集合或其他数据类型。坐标本身可以是列表或元组。如果需要,您可以更改两个输入的顺序。

您可以编写完整的程序或函数。最低字节数获胜,并且不允许出现标准漏洞。

测试用例

您的程序应在这些列表中使用的所有适用值N

[]
[(2,3)]
[(0,0),(1,0),(0,1),(1,1)]
[(0,0),(2,-1),(3,1),(0,4),(5,5)]
[(0,0),(1,0),(2,0),(3,0),(0,3),(1,3),(2,3),(3,3)]
[(0,0),(1,0),(2,0),(3,0),(0,3),(1,3),(2,3),(3,3),(0,1),(0,2),(3,1),(3,2),(8,1),(8,2),(-5,1),(-5,2)]
[(0,0),(20,0),(15,15),(-10,4),(-10,3),(0,-5),(7,6),(7,7),(8,8),(9,8),(10,-2),(-1,12),(-3,10)]
[(0,0),(1,0),(2,0),(3,0),(5,0),(6,0),(7,0),(0,9),(1,9),(2,9),(3,8),(4,9),(5,10),(6,10),(7,9),(3,3),(4,4),(5,5)]

可视化:

===
o
===
oo
oo
===
     o
o     


   o  
o     
  o   
===
oooo


oooo
===
     oooo     
o    o  o    o
o    o  o    o
     oooo     
===
                         o     


         o                     

       o                       

                  oo           
                 o             
                 o             

o                              
o                              


          o                   o

                    o          


          o                    
===
     oo 
ooo o  o
   o    


     o  
    o   
   o    


oooo ooo

Answers:


3

CJam,77 95字节

我认为这可以打更多的球,但是这里有:

q~$<_{{:X;]{[X\]z::-~mhW*}$~:Y{_)Y1{_@=X@=}:B~-g-{+__X=!\}:C~1B=!&}g{_(Y0B-g-\C0B=!&}g}*]_&}L?p

输入类似N <Array of coordinate array>。例如:

4 [[0 0] [1 5] [2 1] [0 3] [5 0] [5 5]]

输出:

[[0 5] [1 5] [0 4] [0 3] [0 0] [0 2] [0 1] [1 1] [2 1]]

算法

该算法非常简单,类似于:

  • 对输入坐标数组进行排序。这使得坐标首先按行然后按列排序。
  • 现在我们选择第一N
  • 现在我们减少这些N点。终点是终点,终点是终点。
  • 然后,我们从最左上角的点开始,向右(或向左)走直到它在下一个点上或直接在下一个点上。
  • 然后我们走到下一个点。
  • 保证在同一行中没有任何发现的点留在上面的点上。这样可以确保我们不会碰到所选的其他任何点N。选择关闭点还可以确保第二条规则成立。

在这里在线尝试

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.