Introdução
Há uma pequena vila com nada além de poucas casas e campos vazios. Os burocratas locais querem dividir a vila em lotes, de modo que cada lote contenha exatamente uma casa, e as bordas dos lotes formam uma ótima grade linear. Sua tarefa é determinar se isso é possível.
A tarefa
Sua entrada é uma matriz 2D retangular de bits; 1 representa uma casa e 0 um campo vazio. Seu tamanho será de pelo menos 1 × 1 e conterá pelo menos um 1. Você pode receber a entrada em qualquer formato razoável (lista aninhada de números inteiros, lista de cadeias, cadeia multilinha etc.).
Seu programa deve determinar se a matriz pode ser dividida em células da grade usando linhas horizontais e verticais retas, de modo que cada célula da grade contenha exatamente um 1. As células da grade podem ter tamanhos e formatos diferentes, embora sempre sejam retangulares. As linhas devem ser executadas de uma borda da matriz até a borda oposta.
Por exemplo, a seguir é uma divisão válida de uma matriz:
00|0010|01|1
01|0000|00|0
--+----+--+-
00|0000|00|1
01|0010|01|0
--+----+--+-
01|1000|10|1
considerando que a divisão a seguir não é válida, pois existem células de grade sem 1s ou mais de 1:
00|0010|01|1
--+----+--+-
01|0000|00|0
00|0000|00|1
01|0010|01|0
--+----+--+-
00|1000|10|1
Se existir uma divisão válida, você deve gerar um valor verdadeiro e, caso contrário, um valor falso.
Regras e pontuação
Você pode escrever um programa completo ou uma função. A menor contagem de bytes vence.
Casos de teste
[[1]] -> True
[[0,1],[1,0]] -> True
[[1,1],[1,0]] -> False
[[1,0,1],[0,1,0]] -> True
[[1,0],[0,1],[0,1]] -> True
[[1,0,0],[0,0,1],[0,1,1]] -> True
[[1,1,1],[1,1,1],[1,1,1]] -> True
[[1,0,1],[0,1,0],[1,0,0]] -> True
[[1,0,0],[1,0,0],[0,1,1]] -> False
[[0,0,0,0,1],[1,0,0,1,0],[0,0,0,1,0]] -> False
[[0,0,1,0,1],[0,0,0,1,0],[0,0,0,0,0]] -> True
[[1,1,0,0,0],[0,0,0,0,0],[1,0,1,0,0]] -> True
[[1,1,0,1,1],[0,1,0,1,1],[1,0,0,0,0]] -> True
[[0,0,0,0,0,0,0],[0,1,1,1,0,1,0],[0,1,0,0,1,0,0],[0,0,0,0,0,0,1],[0,0,1,0,0,0,1],[1,1,0,1,1,0,0]] -> False
[[1,1,0,0,0,0,0],[1,0,1,1,0,1,0],[0,0,0,0,1,0,0],[0,1,0,1,1,0,0],[1,0,0,0,1,1,0],[0,0,0,0,0,1,0]] -> False
[[0,1,0,1,1,1,0],[0,0,0,0,1,0,0],[0,0,0,0,0,0,0],[1,0,0,1,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,1]] -> True
[[0,1,0,0,1,0,1],[1,0,0,0,1,0,1],[0,0,1,0,1,0,1],[1,0,0,0,1,1,0],[0,0,0,1,1,1,0],[0,1,0,0,1,0,1]] -> True
[[0,1,0,0,1,0,0,1,0],[0,0,0,0,1,1,0,1,0],[1,1,0,0,1,0,0,0,0],[0,0,1,0,1,0,1,0,0],[0,0,1,0,1,0,1,0,0],[0,1,0,0,0,1,0,0,1],[0,1,0,0,0,0,1,0,0]] -> False
[[1,0,1,0,0,1,1,0,1],[0,1,1,0,0,1,1,0,1],[1,0,0,0,0,1,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,1,0,0,0,0,1,1],[0,1,1,0,1,0,1,0,1],[1,0,1,0,0,1,1,0,1]] -> True
[[1, 0, 1], [0, 1, 0], [1, 0, 0]]
Essa foi a única matriz 3x3 em que minha nova abordagem estava falhando.Respostas:
Pitão,
3029262423 bytesExperimente online.
Tenho certeza que isso ficará mais curto. Este é O (2 min ) , onde m e n são a largura e a altura da matriz, mas conclui os dois últimos casos de teste em 45 segundos no meu laptop com bateria (i5-5200U com desempenho limitado).
Produz o número de soluções.
Explicação
É realmente divertido trabalhar com matrizes tridimensionais. </sarcasm> Você não deveria entender como isso funciona, mesmo com a explicação.
fonte
Gelatina , 22 bytes
Experimente online!
fonte
Haskell , 116 bytes
Experimente online!
fonte
mergerows
param
.[[1,0],[0,1],[1,0]]
. O problema é que um colapso ganancioso pode atrapalhar um colapso melhor posterior.[[1,1],[1,0]]
colapso obstrui falsamente a[[1],[1],[1]]
solução. Deixe-me dormir sobre isso ou devo excluir?Gelatina , 20 bytes
Essa ainda é uma solução de força bruta, mas é um pouco mais rápida que minha outra resposta - que não consegue lidar com os dois últimos casos de teste no TIO - e lida com todos os casos de teste em ~ 4 segundos.
Experimente online!
Como funciona
fonte