Le Isole Solitarie


10

Ingresso:

Un array 2D contenente due valori distinti (facoltativi). Userò 0 e 1 per spiegare le regole. Il formato di input è ovviamente flessibile.


Sfida:

Gli zeri sono acqua e quelli sono isole. Al fine di garantire la solitudine, il tuo compito è di circondare tutte le isole con acqua inserendo file e colonne di zeri. Non vuoi sprecare acqua, quindi devi ridurre al minimo la quantità di acqua aggiunta. Nel caso in cui ci sia più di una soluzione che richiede la stessa quantità di acqua aggiunta, è necessario aggiungere colonne d'acqua, non file. Lo mostrerò nei casi di test.


Produzione:

Il nuovo array 2D modificato. Il formato di output è ovviamente flessibile.


Casi test:

Input e output sono separati da trattini. Gli zeri aggiunti vengono visualizzati in grassetto. Utilizzare una delle risposte qui se si desidera convertire i casi di test in formati più convenienti.

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

Nota che abbiamo aggiunto una colonna di zeri, non una fila di zeri. Questo perché il numero di zeri necessari è uguale e le colonne dovrebbero essere preferite.


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

Tieni presente che abbiamo aggiunto righe, non colonne, poiché richiede la minima quantità di zeri extra.


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

Ciò ha richiesto entrambe le colonne e una riga.


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

Meglio aggiungere due colonne rispetto a una riga, poiché richiede meno acqua.


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

Meglio aggiungere due file di una colonna, poiché richiede meno acqua.



Dannazione, Stewie, ora ho di nuovo "Jack Sparrow" bloccato nella mia testa!
Shaggy,

Questo problema equivale al problema della copertura dei vertici sul grafico bipartito e secondo Wikipedia può essere risolto in tempo polinomiale.
user202729

Ho cambiato idea ... potrebbe essere ponderato. Comunque per una matrice quadrata sufficientemente grande è (si spera) equivalente. Quindi, se il tuo algoritmo è "troppo semplice", fai attenzione .
user202729

Penso di avere un algoritmo temporale polinomiale.
user202729

Risposte:


2

Gelatina , 37 byte

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

Provalo online!

Funzione che restituisce un array 2D di numeri interi. Si noti che naturalmente nell'elenco singleton Jelly viene visualizzato come valore, quindi Gviene utilizzato per formattare l'output.


  • Link 1: Return (validità).
  • Collegamento 2: programma principale.

Il programma funziona in tempo esponenziale, ma finora non sono riuscito a pensare ad alcun algoritmo temporale polinomiale. Utilizza la Ƥfunzione diadica, che caratterizza la sfida postdatata.


2

Python 2 , 374 346 340 339 323 317 byte

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]

Provalo online!


Penso che il primo [:]possa essere rimosso senza influire sull'output.
user202729

@ user202729, grazie, penso di si. Nel frattempo l'avevo cambiato :)
TFeld,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.