Vamos imaginar que temos uma matriz de bits (que contém pelo menos um 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
Queremos definir alguns dos bits nessa matriz, de forma que eles formem um blob contíguo de 1
s, no qual todos 1
sejam direta ou indiretamente conectados entre si 1
por meio de movimento ortogonal:
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
(Você pode ver isso mais claramente pesquisando 1
com o recurso "encontrar" do navegador).
No entanto, também queremos minimizar o número de bits que definimos.
A tarefa
Dada uma matriz (ou matriz de matrizes) de bits ou booleanos, retorne o número mínimo de bits que precisam ser configurados para criar um continente contíguo de 1
s. Deveria ser possível passar de um bit definido na matriz para outro apenas viajando em uma direção ortogonal para outros bits definidos.
Isso é código-golfe , então o menor envio válido (medido em bytes) vence.
Casos de teste
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
fonte
1
na matriz?Respostas:
C (gcc),
308306 bytesA função
f
recebe(height, width, flattened array, pointer to ans)
e retorna a resposta pelo ponteiro.Se não houver
1
na matriz, ele retornará0
.Experimente online!
Ungolfed:
fonte
Python 2 , 611 bytes
Um programa completo que leva uma lista de listas através da entrada do usuário. As funções
I
ed
contam o número de ilhas na matriz. O loop for no final enumera todas as possibilidades de onde você pode alterar0
s para1
s; se houver uma ilha, o número de1
s adicionado à lista será deixadoC
. O mínimo dessa lista é o número mínimo de inversões de bits necessárias para conectar quaisquer ilhas. É um algoritmo muito lento e, portanto, não executa os casos de teste dados abaixo dos 60 anos (não tentei mais), mas tentei alguns casos de teste menores (~ 5x5) e parece estar funcionando corretamente. Eu peguei o algoritmo de contagem de ilhas nesta página.Experimente online!
Versão pré -olfizada antes de otimizar algumas coisas:
fonte