Imaginons que nous ayons une matrice de bits (qui en contient au moins un 1
):
0 1 0 1 1 0 1 0 0 1 0
0 1 0 1 0 0 1 0 1 1 0
0 0 1 0 1 1 0 1 0 1 0
1 1 0 0 1 0 0 1 1 0 1
0 0 0 1 0 1 1 0 0 1 0
Nous voulons définir certains des bits de cette matrice de telle sorte qu'elle forme une goutte contiguë de 1
s, dans laquelle chacun 1
est directement ou indirectement connecté les uns aux autres 1
par un mouvement orthogonal:
0 1 1 1 1 1 1 0 0 1 0
0 1 0 1 0 0 1 0 1 1 0
0 1 1 0 1 1 1 1 0 1 0
1 1 0 0 1 0 0 1 1 1 1
0 0 0 1 1 1 1 0 0 1 0
(Vous pouvez le voir plus clairement en recherchant 1
avec la fonction "trouver" de votre navigateur.)
Cependant, nous voulons également minimiser le nombre de bits que nous définissons.
La tâche
Étant donné une matrice (ou un tableau de tableaux) de bits ou de booléens, retournez le nombre minimum de bits qui doivent être définis pour créer un continent contigu de 1
s. Il devrait être possible de passer d'un bit défini dans la matrice à un autre en se déplaçant uniquement dans une direction orthogonale vers d'autres bits définis.
Il s'agit de code-golf , donc la soumission valide la plus courte (mesurée en octets) l'emporte.
Cas de test
0 1 0 1 1 0 1 0 0 1 0
0 1 0 1 0 0 1 0 1 1 0
0 0 1 0 1 1 0 1 0 1 0
1 1 0 0 1 0 0 1 1 0 1
0 0 0 1 0 1 1 0 0 1 0
=> 6
1 0 0 0 0 0 1 0 0
1 1 0 0 1 1 1 0 0
1 1 1 0 1 1 1 1 1
0 1 0 0 0 0 0 0 0
0 0 0 0 0 1 1 1 1
0 1 0 0 0 0 1 1 0
1 0 0 0 0 0 1 0 0
=> 4
0 0 0 1 1 1 0 1 1
0 0 1 0 0 0 0 1 0
0 0 1 1 1 1 1 1 0
1 1 0 0 1 1 0 0 0
0 0 1 1 1 0 0 1 1
0 1 1 1 0 0 0 0 0
1 1 1 0 0 1 1 1 0
1 1 1 0 1 1 0 1 1
0 0 0 0 1 0 0 0 1
1 1 0 0 1 1 0 1 1
0 0 0 0 0 0 0 1 0
0 1 1 1 1 0 0 0 0
0 0 0 1 1 0 0 0 1
0 1 0 0 1 0 1 1 0
0 1 1 1 0 0 0 0 1
=> 8
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
=> 0
la source
1
dans la matrice?Réponses:
C (gcc),
308306 octetsLa fonction
f
reçoit(height, width, flattened array, pointer to ans)
et renvoie une réponse par pointeur.S'il n'y a pas
1
dans la matrice, il reviendra0
.Essayez-le en ligne!
Non golfé:
la source
Python 2 , 611 octets
Un programme complet qui prend une liste de listes à travers l'entrée utilisateur. Les fonctions
I
etd
compter le nombre d'îles dans le tableau. La boucle for à la fin énumère toutes les possibilités où vous pouvez changer0
s en1
s puis s'il reste un îlot stocke le nombre de1
s ajoutés à la listeC
. Le minimum de cette liste est le nombre minimum de retournements de bits requis pour connecter les îles. C'est un algorithme très lent, donc il n'exécute pas les cas de test donnés en moins de 60 ans (je n'ai pas essayé plus longtemps) mais j'ai essayé quelques cas de test plus petits (~ 5x5) et il semble fonctionner correctement. J'ai obtenu l'algorithme de comptage des îles sur cette page.Essayez-le en ligne!
Version prégolfée avant d'optimiser certaines choses:
la source