孤岛


10

输入:

包含两个不同(可选)值的2D数组。在解释规则时,我将使用01。输入格式当然是灵活的。


挑战:

零是水,一个是小岛。为了确保孤独,您的任务是通过插入零行和零列将所有岛屿用水包围。您不想浪费水,因此您必须减少添加的水量。如果有不止一种溶液需要添加相同量的水,则应添加水栏,而不是行。我将在测试案例中展示这一点。


输出:

新的修改后的2D数组。输出格式当然是灵活的。


测试用例:

输入和输出以短划线分隔。添加的零以粗体显示。如果要将测试用例转换为更方便的格式,请在此处使用答案之一。

1
---
1

1 1
---
1 0 1

1 1
1 1
---
1 0 1
0 0 0
1 0 1

1 0
0 1
---
1 0 0
0 0 1

请注意,我们添加了一列零,而不是一列零。这是因为必要的零的数目相等,因此应首选列。


1 0 0 0 1
0 1 0 1 0
0 0 1 0 0
0 1 0 1 0
---
1 0 0 0 1
0 0 0 0 0
0 1 0 1 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 1 0 1 0

请注意,我们添加了行而不是列,因为这需要最少数量的额外零。


0 0 1 0 0
0 1 1 1 0
---
0 0 0 1 0 0 0
0 0 0 0 0 0 0
0 1 0 1 0 1 0

这需要列和行。


0 0 1 0 0
0 1 0 1 0
---
0 0 0 1 0 0 0
0 1 0 0 0 1 0

最好增加两列而不是一行,因为它需要更少的水。


0 0
1 0
0 1
1 0
0 0
---
0 0 
1 0
0 0 
0 1 
0 0 
1 0
0 0

最好增加两行而不是一列,因为它需要更少的水。



该死的,Stewie,现在我又把“ Jack Sparrow”塞进了我的脑海!
毛茸茸的

这个问题等效于二部图上的顶点覆盖问题,根据Wikipedia的说法,它可以在多项式时间内解决。
user202729 '18

我改变了主意...这可能很重要。无论如何,对于足够大的方阵,它(希望)是等效的。因此,如果您的算法“过于简单”,请当心
user202729'4

我想我有一个多项式时间算法。
user202729 '18

Answers:


2

果冻,37个字节

ṫƤ-S€ZƊ⁺FỊẠ
Z_,,WƲ€ŒpẎ€Ʋ⁺€ẎLÞFL$ÞṚÇÞṪ

在线尝试!

返回2D整数数组的函数。请注意,自然在Jelly单例列表中将其显示为值,因此G可用于格式化输出。


  • 链接1:退货(有效期)。
  • 链接2:主程序。

该程序以指数时间运行,但是到目前为止我还没有想到任何多项式时间算法。用于Ƥ二进位功能,该功能推迟了挑战。


2

Python 2中374个 346 340 339 323 317字节

R=range;L=len
def f(a):
 w,h=L(a[0]),L(a);W=[]
 for i in R(2**w):
	A=zip(*a)
	for c in R(w):A[-c:-c]=[[0]*h]*(i&1<<c>0)
	for j in R(2**h):
	 B=zip(*A);x=L(B[0])
	 for r in R(h):B[-r:-r]=[(0,)*x]*(j&1<<r>0)
	 y=L(B);W+=[(w*h-x*y,x,B)]*all(sum(B[i][j:j+2]+B[i+1][j:j+2])<2for i in R(y-1)for j in R(x))
 return max(W)[2]

在线尝试!


我认为[:]可以删除第一个而不影响输出。
user202729'4

@ user202729,谢谢,我认为可以。不过我在此同时进行了更改:)
TFeld
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.