sfondo
Voglio costruire una recinzione. Per questo, ho raccolto un mucchio di pali e li ho bloccati a terra. Ho anche raccolto un sacco di assi che inchioderò ai pali per realizzare il recinto reale. Tendo a lasciarmi trasportare dalle cose, e molto probabilmente continuerò a inchiodare le assi ai pali fino a quando non c'è più posto dove metterle. Voglio che tu enumeri le possibili recinzioni con cui posso finire.
Ingresso
Il tuo input è un elenco di coordinate intere bidimensionali che rappresentano le posizioni dei poli, in qualsiasi formato conveniente. Puoi presumere che non contenga duplicati, ma non puoi assumere nulla del suo ordine.
Le schede sono rappresentate da linee rette tra i poli e, per semplicità, consideriamo solo schede orizzontali e verticali. Due assi possono essere uniti da una tavola se non ci sono altri poli o assi tra loro, il che significa che le assi non possono incrociarsi. Una disposizione di poli e pannelli è massima se non è possibile aggiungere nuovi pannelli (equivalentemente, c'è un palo o un pannello tra due poli allineati orizzontalmente o verticalmente).
Produzione
Il tuo output è il numero di disposizioni massime che possono essere costruite usando i poli.
Esempio
Considera l'elenco di input
[(3,0),(1,1),(0,2),(-1,1),(-2,0),(-1,-1),(0,-2),(1,-1)]
Vista dall'alto, la disposizione dei poli corrispondente assomiglia a questa:
o
o o
o o
o o
o
Esistono esattamente tre disposizioni massime che possono essere costruite usando questi poli:
o o o
o-o o|o o-o
o----o o||| o o| | o
o-o o|o o-o
o o o
Quindi l'output corretto è 3
.
Regole
È possibile scrivere una funzione o un programma completo. Vince il conteggio di byte più basso e non sono consentite scappatoie standard.
Casi test
[] -> 1
[(0,0),(1,1),(2,2)] -> 1
[(0,0),(1,0),(2,0)] -> 1
[(0,0),(0,1),(1,0),(1,1)] -> 1
[(1,0),(0,1),(-1,0),(0,-1)] -> 2
[(3,0),(1,1),(0,2),(-1,1),(-2,0),(-1,-1),(0,-2),(1,-1)] -> 3
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1)] -> 3
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1),(0,-1)] -> 4
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(0,-1),(2,2)] -> 5
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1),(0,-1),(2,2)] -> 8
(0,-2)
, buona cattura. Cambiando adesso.