Máximos locales de una matriz
Un elemento de una matriz es un máximo local si es mayor que todos sus vecinos. Por ejemplo, en la matriz
1 2 3 4 5 |
[[1,0,0,8], [0,2,0,3], [0,0,0,5], [3,5,7,6], [1,2,3,4]] |
los máximos locales son 8 (en la posición (1,4)), 2 (en la posición (2,2)) y 7 (en la posición (4,3)).
Definimos el tipo de las matrices, mediante
1 |
type Matriz a = Array (Int,Int) Int |
y el ejemplo anterior por
1 2 3 4 5 6 |
ej1 :: Matriz Int ej1 = listArray ((1,1),(5,4)) (concat [[1,0,0,8], [0,2,0,3], [0,0,0,5], [3,5,7,6], [1,2,3,4]]) |
Definir la función
1 |
maximosLocales :: Matriz Int -> [((Int,Int),Int)] |
tal que (maximosLocales p) es la lista de las posiciones en las que hay un máximo local, con el valor correspondiente. Por ejemplo,
1 |
maximosLocales ej1 == [((1,4),8),((2,2),2),((4,3),7)] |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import Data.Array type Matriz a = Array (Int,Int) a ej1 :: Matriz Int ej1 = listArray ((1,1),(5,4)) (concat [[1,0,0,8], [0,2,0,3], [0,0,0,5], [3,5,7,6], [1,2,3,4]]) maximosLocales :: Matriz Int -> [((Int,Int),Int)] maximosLocales p = [((i,j),p!(i,j)) | (i,j) <- indices p, and [p!(a,b) < p!(i,j) | (a,b) <- vecinos (i,j)]] where (_,(m,n)) = bounds p vecinos (i,j) = [(a,b) | a <- [max 1 (i-1)..min m (i+1)], b <- [max 1 (j-1)..min n (j+1)], (a,b) /= (i,j)] |
5 Comentarios