Número de islas rectangulares de una matrizexer
En este problema se consideran matrices cuyos elementos son 0 y 1. Los valores 1 aparecen en forma de islas rectangulares separadas por 0 de forma que como máximo las islas son diagonalmente adyacentes. Por ejemplo,
ej1, ej2 :: Array (Int,Int) Int ej1 = listArray ((1,1),(6,3)) [0,0,0, 1,1,0, 1,1,0, 0,0,1, 0,0,1, 1,1,0] ej2 = listArray ((1,1),(6,6)) [1,0,0,0,0,0, 1,0,1,1,1,1, 0,0,0,0,0,0, 1,1,1,0,1,1, 1,1,1,0,1,1, 0,0,0,0,1,1]
Definir la función
numeroDeIslas :: Array (Int,Int) Int -> Int
tal que (numeroDeIslas p) es el número de islas de la matriz p. Por ejemplo,
numeroDeIslas ej1 == 3 numeroDeIslas ej2 == 4
Soluciones
import Data.Array type Matriz = Array (Int,Int) Int ej1, ej2 :: Array (Int,Int) Int ej1 = listArray ((1,1),(6,3)) [0,0,0, 1,1,0, 1,1,0, 0,0,1, 0,0,1, 1,1,0] ej2 = listArray ((1,1),(6,6)) [1,0,0,0,0,0, 1,0,1,1,1,1, 0,0,0,0,0,0, 1,1,1,0,1,1, 1,1,1,0,1,1, 0,0,0,0,1,1] numeroDeIslas :: Array (Int,Int) Int -> Int numeroDeIslas p = length [(i,j) | (i,j) <- indices p, verticeSuperiorIzquierdo p (i,j)] -- (verticeSuperiorIzquierdo p (i,j)) se verifica si (i,j) es el -- vértice superior izquierdo de algunas de las islas de la matriz p, -- Por ejemplo, -- λ> [(i,j) | (i,j) <- indices ej1, verticeSuperiorIzquierdo ej1 (i,j)] -- [(2,1),(4,3),(6,1)] -- λ> [(i,j) | (i,j) <- indices ej2, verticeSuperiorIzquierdo ej2 (i,j)] -- [(1,1),(2,3),(4,1),(4,5)] verticeSuperiorIzquierdo :: Matriz -> (Int,Int) -> Bool verticeSuperiorIzquierdo p (i,j) = enLadoSuperior p (i,j) && enLadoIzquierdo p (i,j) -- (enLadoSuperior p (i,j)) se verifica si (i,j) está en el lado -- superior de algunas de las islas de la matriz p, Por ejemplo, -- λ> [(i,j) | (i,j) <- indices ej1, enLadoSuperior ej1 (i,j)] -- [(2,1),(2,2),(4,3),(6,1),(6,2)] -- λ> [(i,j) | (i,j) <- indices ej2, enLadoSuperior ej2 (i,j)] -- [(1,1),(2,3),(2,4),(2,5),(2,6),(4,1),(4,2),(4,3),(4,5),(4,6)] enLadoSuperior :: Matriz -> (Int,Int) -> Bool enLadoSuperior p (1,j) = p!(1,j) == 1 enLadoSuperior p (i,j) = p!(i,j) == 1 && p!(i-1,j) == 0 -- (enLadoIzquierdo p (i,j)) se verifica si (i,j) está en el lado -- izquierdo de algunas de las islas de la matriz p, Por ejemplo, -- λ> [(i,j) | (i,j) <- indices ej1, enLadoIzquierdo ej1 (i,j)] -- [(2,1),(3,1),(4,3),(5,3),(6,1)] -- λ> [(i,j) | (i,j) <- indices ej2, enLadoIzquierdo ej2 (i,j)] -- [(1,1),(2,1),(2,3),(4,1),(4,5),(5,1),(5,5),(6,5)] enLadoIzquierdo :: Matriz -> (Int,Int) -> Bool enLadoIzquierdo p (i,1) = p!(i,1) == 1 enLadoIzquierdo p (i,j) = p!(i,j) == 1 && p!(i,j-1) == 0 -- 2ª solución -- =========== numeroDeIslas2 :: Array (Int,Int) Int -> Int numeroDeIslas2 p = length [(i,j) | (i,j) <- indices p, p!(i,j) == 1, i == 1 || p!(i-1,j) == 0, j == 1 || p!(i,j-1) == 0]