Esses retângulos podem preencher um espaço retangular?
Dado um monte de retângulos, você será perguntado se eles podem ou não ser organizados para preencher um espaço retangular.
Especificações
Dado um monte de m x n
retângulos arbitrários ; 0 <= m, n <= 1000
, determine se é possível ou não organizá-los para que cubram exatamente uma área retangular, sem furos ou sobreposições. Os retângulos não podem ser girados e cada retângulo pode ser colocado apenas uma vez.
Entrada
A entrada para isso é muito flexível, desde que a entrada forneça algum tipo de lista de dimensões com 2 espaços. Por exemplo, ambos os seguintes são válidos:
Separado pelo espaço, retorno
1 2
1 5
4 5
3 6
Lista de dimensões
[[1, 2], [1, 5], [4, 5], [3, 6]]
Saída
Qualquer tipo de valor verdadeiro / falso, como verdadeiro / falso, 0/1, T / F, Verdadeiro / Falso etc. Se você usar um método de saída que não seja muito óbvio, especifique na sua resposta.
Exemplos
Caso de teste 1
Entrada:
1 1
1 5
2 6
Saída:
true
(ou algo semelhante)
Como organizar:
XYYYYY
ZZZZZZ
ZZZZZZ
Caso de teste 2
Entrada:
1 1
2 2
Saída:
false
(ou algo semelhante)
Explicação: Torna-se óbvio que você não pode organizar dois quadrados de tamanhos diferentes e alinhar suas bordas.
Caso de teste 3
Entrada:
1 1
1 2
1 2
2 1
2 1
Saída:
true
(ou algo semelhante) Como organizar:
AAB
DEB
DCC
Como o @ETHProductions apontou, para todos os outros casos de teste, você pode continuar combinando retângulos com um comprimento de borda comum até ter apenas um retângulo; portanto, este caso de teste é apenas para quebrar qualquer código que use essa idéia.
Caso de teste 4
Entrada:
3 2
4 1
2 1
4 1
2 1
5 2
3 2
1 4
3 2
2 1
2 1
1 1
5 1
Saída:
true
(ou algo semelhante)
Como organizar:
AAABBBBEE
AAACCDDDD
FFFFFGGGH
FFFFFGGGH
IIIJJKKLH
IIIMMMMMH
Nota : Você não precisa declarar como organizá-lo, apenas precisa determinar se não pode ser arranjado.
Isso é código de golfe, então a resposta mais curta em bytes vence! Aceitarei a resposta mais curta a partir de 14 de janeiro, mas fique à vontade para enviar respostas depois disso, pois ainda posso dar votos! :)
Feliz golfe!
~ AL
PS Se você souber qual tag deve ser aplicada a esse problema, adicione-a, não faço a menor idéia do que colocar como tag, exceto code-golf.
Edição : seu programa deve ser capaz de processar até 25 retângulos, em no máximo 10 segundos em um computador decente (eu serei bastante flexível com essa regra).
EDIT : Estendi o prazo de aceitação de envio para o último dia do ano, mas duvido que receberei uma resposta até então ...
EDIT : estendi o prazo de aceitação de envio em 2 semanas; portanto, se não houver mais respostas até então, a resposta C atual será aceita! :)
fonte
[[1, 2], [2, 1], [1, 1], [1, 2], [2, 1]]
(que pode ser arranjadoABB ACD EED
). Você pode adicionar este caso de teste simples.Respostas:
C, 1135
115812311598bytesBem, já passou do prazo estabelecido, mas, como ainda não há respostas, aqui está uma (um pouco longa) em C.
Devoluções:
Atualizar:
O código original pode ficar preso em algumas matrizes, levando muito mais tempo do que os 10s permitidos. A revisão atual deve concluir todas as matrizes abaixo de 1s. Isso é feito 1) Classificando os retângulos de entrada e 2) pulando os tamanhos repetidos durante o ajuste.
Golfe:
UnGolfed:
Explicação: Nós temos 6 funções:
main
,O
,Q
,F
,L
eT
.T
t ESTs para ver se há espaço para o rectângulo em um determinado local.L
fil l é um rectângulo para a memória intermédia de saída ou, alternadamente remove um a substituí-lo.O
eQ
construir as paredes esquerda e superior, respectivamente, eF
f males o restante do retângulo por busca iterativa.Embora a pesquisa básica seja iterativa, eliminamos a grande maioria dos vetores de pesquisa possíveis, primeiro construindo as combinações permitidas de largura e altura para o retângulo mestre e, em seguida, eliminando configurações impossíveis. Pode-se obter velocidade adicional em retângulos maiores, determinando as paredes inferior e direita antes de encher o centro, mas não é necessária uma velocidade decente ao limitar a 25 retângulos internos.
fonte
Haskell, 226 bytes
Experimente no Ideone
Como funciona
Isso recursivamente pesquisa todas as inclinações parciais cuja forma é um diagrama de Young , adicionando um retângulo por vez e verifica se algum dos resultados finais são retângulos.
Para ver que qualquer lado a lado de um retângulo pode ser construído dessa maneira: em qualquer lado a lado de um diagrama de Young não vazio, seja R o conjunto de retângulos no lado a lado cujo canto sudoeste não toque em nenhum outro retângulo. Como cada vértice côncavo do diagrama de Young é adjacente à aresta (não apenas adjacente ao canto) a no máximo um retângulo em R, e o número desses vértices côncavos é um menor que o número de retângulos em R, deve haver pelo menos um retângulo em R que é adjacente à borda de nenhum desses vértices côncavos. Removê-lo produz outro diagrama de Young, para que possamos prosseguir por indução.
fonte