Les îles solitaires

10

Contribution:

Un tableau 2D contenant deux valeurs distinctes (facultatives). Je vais utiliser 0 et 1 pour expliquer les règles. Le format d'entrée est bien sûr flexible.


Défi:

Les zéros sont de l'eau et les uns sont des îles. Afin d'assurer la solitude, votre tâche consiste à entourer toutes les îles d'eau en insérant des rangées et des colonnes de zéros. Vous ne voulez pas gaspiller l'eau, vous devez donc minimiser la quantité d'eau ajoutée. Dans le cas où plusieurs solutions nécessitent la même quantité d'eau ajoutée, vous devez ajouter des colonnes d'eau, pas des rangées. Je vais le montrer dans les cas de test.


Production:

Le nouveau tableau 2D modifié. Le format de sortie est bien sûr flexible.


Cas de test:

L'entrée et la sortie sont séparées par des tirets. Les zéros ajoutés sont affichés en caractères gras. Utilisez l'une des réponses ici si vous souhaitez convertir les cas de test dans des formats plus pratiques.

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

Notez que nous avons ajouté une colonne de zéros, pas une ligne de zéros. En effet, le nombre de zéros nécessaires est égal et les colonnes doivent être préférées.


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

Notez que nous avons ajouté des lignes, pas des colonnes, car cela nécessite le moins de zéros supplémentaires.


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

Cela nécessitait à la fois des colonnes et une ligne.


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

Mieux vaut ajouter deux colonnes qu'une ligne, car cela nécessite moins d'eau.


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

Mieux vaut ajouter deux lignes qu'une colonne, car il nécessite moins d'eau.

Stewie Griffin
la source
Connexes .
Stewie Griffin du
Merde, Stewie, maintenant j'ai encore "Jack Sparrow" coincé dans ma tête!
Shaggy
Ce problème est équivalent au problème de la couverture des sommets sur un graphe bipartite, et selon Wikipedia, il peut être résolu en temps polynomial.
user202729
J'ai changé d'avis ... ça peut être pondéré. Quoi qu'il en soit, pour une matrice carrée suffisamment grande, c'est (espérons-le) l'équivalent. Donc, si votre algorithme est "trop ​​simple", soyez prudent .
user202729
Je pense que j'ai un algorithme de temps polynomial.
user202729

Réponses:

2

Gelée , 37 octets

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

Essayez-le en ligne!

Fonction renvoyant un tableau 2D d'entiers. Notez que naturellement, dans Jelly, la liste singleton s'affiche comme sa valeur et Gest donc utilisée pour formater la sortie.


  • Lien 1: Retour (validité).
  • Lien 2: programme principal.

Le programme s'exécute en temps exponentiel, mais jusqu'à présent, je ne pouvais penser à aucun algorithme de temps polynomial. Utilisations Ƥsur la fonction dyadique, cette fonctionnalité est postérieure au défi.

user202729
la source
2

Python 2 , 374 346 340 339 323 317 octets

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]

Essayez-le en ligne!

TFeld
la source
Je pense que le premier [:]peut être supprimé sans affecter la sortie.
user202729
@ user202729, Merci, je pense que c'est possible. Je l'avais cependant changé entre-temps :)
TFeld