Trova il numero di rettangoli in una matrice di byte 2D


12
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000001111111111111100000000000000000011111111111111100000000000000000
0000001111111111111100000000000000000011111111111111100000000000000000
0000001111111111111100000000000000000011111111111111100000000000000000
0000001111111111111100000000000000000011111111111111100000000000000000
0000000000000000000000000000000000000011111111111111100000000000000000
0000000000000000000000000000000000000011111111111111100000000000000000
0000000000011111100000000000000000000011111111111111100000000000000000
0000000000011111100000000000000000000011111111111111100000000000000000
0000000000011111100000000000000000000011111111111111100000000000000000
0000000000000000000000000000000000000011111111111111100000000000000000
0000000000000000000000000000000000000011111111111111100000000000000000
0000000000000111111000000000000000000011111111111111100000000000000000
0000000000000100001000000111111000000011111111111111100000000010000000
0000000000000100001000000111111000000000000000000000011000000000000000
0000000000000111111000000111111000000000000000000000011000000000000000
0000000000000000000000000000111111000000000000000000000000000000000000
0000000000000000000000000000111111000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000

Ti viene fornita una matrice bidimensionale di byte di dimensioni mx n. È garantito che tutti i byte siano 1 o 0. Trova il numero di rettangoli rappresentati da 1 quando visualizzato in 2d, come mostrato sopra.

Per il conteggio vengono considerati solo rettangoli pieni.
I rettangoli devono essere circondati da 0 a meno che non siano sul bordo (i rettangoli toccanti in diagonale di 1 vanno bene però (vedi esempio.)).

Ad esempio, nell'array sopra ci sono 5 rettangoli validi.

Puoi usare qualsiasi lingua.


1
Penso che un modo migliore per dire sia quello di dire: i rettangoli devono essere circondati da 0 o un bordo
Cruncher

Fatto. Grazie per averlo scritto in un inglese migliore.
microbian

Che dire 1100\n1100\n0011\n0011?
Cruncher,

1
Penso che sia per questo che ho scritto "adiacente / sovrapposto". Questi sono 2 rettangoli validi dalla mia intenzione iniziale. Ma la condizione "circostante" li sta limitando ora. Hai un modo migliore per spiegarlo
microbian

1
Anche adiacente è ambiguo dire se diagonale significa adiacente o no. La stessa ambiguità se circondato o meno significa, circondato agli angoli o solo ai lati
Cruncher

Risposte:


2

GolfScript, 107 caratteri

.n?):L;'1'/{,}%{1$+)}*;][]\{:A{{+}+[1L.~)-1]%&}+1$\,.@^\[[[A]]+{|}*]+}/{.{L%}{%$..&1$,1$,/*$=}:C~\{L/}C&},,

L'ingresso deve essere dato su STDIN.

Esempi:

11
01
-
0

111
111
-
1

100
001
001
-
2

11100
10101
11100
-
1

101
010
101
-
5

Vedi i commenti sopra - sembra che i rettangoli "validi" debbano avere larghezza / altezza entrambi> 1.
Paul R,

@PaulR Quella regola non è scritta nella domanda, con tutte le definizioni ragionevoli quelli sono dei rettangoli perfettamente perfetti - forse lo aggiungerò più avanti.
Howard,

Sono d'accordo con la tua definizione - stavo solo notando la discrepanza nei commenti - sembra che OP abbia bisogno di aggiornare la domanda per renderla più definitiva.
Paul R,

Ho chiarito che il rettangolo di dimensione 1 è valido.
microbian

Ma hai anche detto nei commenti, in risposta a: "Solo per chiarimenti, i rettangoli degeneri non devono essere contati, giusto? Ad esempio, un singolo 1 o un singolo sottotitolo / sottocolonna di 1 adiacente non è valido?" dicendo: "Sì, non sono validi e non devono essere conteggiati".
Paul R,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.