Yalnız Adalar


10

Giriş:

İki ayrı (isteğe bağlı) değer içeren bir 2B dizi. Kuralları açıklarken 0 ve 1 kullanacağım . Giriş formatı elbette esnektir.


Meydan okuma:

Sıfırlar su ve adalar. Yalnızlığı sağlamak için göreviniz sıfırlar halinde sütunlar ve sütunlar ekleyerek tüm adaları su ile çevrelemektir. Su israf etmek istemezsiniz, bu yüzden eklenen su miktarını en aza indirmelisiniz. Aynı miktarda su gerektiren birden fazla çözelti varsa, satırları değil, su sütunlarını eklemelisiniz. Bunu test senaryolarında göstereceğim.


Çıktı:

Yeni, değiştirilmiş 2D dizi. Çıktı formatı elbette esnektir.


Test senaryoları:

Girdi ve çıktı kesik çizgilerle ayrılır. Eklenen sıfırlar kalın yazı tipiyle gösterilir. Cevaplar birini kullanın burada size daha uygun biçimlere test durumları dönüştürmek istiyorsanız.

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

Bir satır sıfır değil, bir sütun eklediğimizi unutmayın. Bunun nedeni, gerekli sıfırların sayısının eşit olması ve sütunların tercih edilmesidir.


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

En az miktarda ekstra sıfır gerektirdiğinden sütun değil satır eklediğimizi unutmayın.


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

Bu hem sütunları hem de bir satırı gerektiriyordu.


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

Bir satırdan iki sütun eklemek daha iyidir, çünkü daha az su gerektirir.


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

Bir sütundan iki satır eklemek daha iyidir, çünkü daha az su gerektirir.



Damnit, Stewie, şimdi yine kafama "Jack Sparrow" taktım!
Shaggy

Bu problem, bipartit grafiğindeki tepe örtüsü problemine eşdeğerdir ve Wikipedia'ya göre polinom zamanında çözülebilir.
user202729

Fikrimi değiştirdim ... ağırlıklı olabilir. Her neyse, yeterince büyük kare matris için (umarım) eşdeğerdir. Bu nedenle algoritmanız "çok basit" ise dikkatli olun .
user202729

Bence polinom zaman algoritmam var.
user202729

Yanıtlar:


2

Jöle , 37 bayt

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

Çevrimiçi deneyin!

2D bir tamsayı dizisi döndüren işlev. Jöle tekil listesindeki doğal olarak değeri Gbiçimlendirdiğinden, çıktıyı biçimlendirmek için kullanıldığını unutmayın.


  • Bağlantı 1: İade (geçerlilik).
  • Bağlantı 2: Ana program.

Program üstel zamanda çalışır, ancak şimdiye kadar herhangi bir polinom zaman algoritması düşünemedim. ƤBu özellik, meydan okumadan sonra gelen ikili işlevi kullanır .


2

Python 2 , 374 346 340 339 323 317 bayt

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]

Çevrimiçi deneyin!


[:]İlkinin çıktıyı etkilemeden çıkarılabileceğini düşünüyorum .
user202729

@ user202729, Teşekkürler, bence yapabilir. Bu arada değiştirdim :)
TFeld
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.