solveMaze x = let
all = concat[[(row, colum, char)|(colum, char)<-zip [0..]line] |(row, line )<-zip [0..] x ]
(start_r, start_c, _)=head (filter (test ‘s’) all)
(end_r, end_c, _)=head (filter (test ‘e’) all)
filterFree= [(row,colum)|(row,colum,char)<-all, char==’ ‘||char==’e’]
solve [] _=[]
solve ((row,colum, price):rest) (freeElement) = let
n= [x|x<-[(row +1,colum),(row-1,colum),(row, colum+1),(row,colum-1)], x`elem` freeElement]
in (row,colum, price): solve (rest ++ [(row,colum,price+1)|(row,colum)<-n]) [x|x<-freeElement, x`notElem` n]
solution= solve [(start_r,start_c,0)] filterFree
in head [p |(row,colum,p) <-solution, row == end_r , colum== end_c]
test :: Eq a1 => a1 -> (a2, b, a1) -> Bool
test x (row, colum, char) = char == x
allPositions x =concat[[(row, colum, char)|(colum, char)<-zip [0..]line] |(row, line )<-zip [0..] x ]
— (startR,startC, _ )= head $ filter (matchesChar ‘s’) allPositions
— (endR, endC,_ )=head $ filter (matchesChar ‘e’) allPositions
findStartEnd maze =
let allPos = allPositions maze
(startR, startC, _) = head $ filter (matchesChar ‘s’) allPos
(endR, endC, _) = head $ filter (matchesChar ‘e’) allPos
in ((startR, startC), (endR, endC))
matchesChar char (_, _, c) = c == char