Haskell中兼容DFS的无坐标二维矩阵邻域实现问询
二维矩阵搜索的无坐标邻域函数需求
近期我在处理大量二维矩阵搜索问题,一直采用基于坐标的DFS框架,代码如下:
data State = S { word :: String, coord :: Coord } deriving (Eq, Ord, Read, Show) data Coord = C Int Int deriving (Eq, Ord, Read, Show) dfsOnN :: Ord r => (a -> r) -> (a -> [a]) -> [a] -> [a] coordMap :: [[a]] -> Map Coord a cardinals :: Coord -> [Coord] neighbors :: Map Coord Char -> State -> [State] solution :: [[Char]] -> String -> Bool solution board w = any found . search . states w $ board where search = dfsOnN coord (neighbors vals) found = (== "") . word vals = coordMap board
当前方案存在明显冗余:需要将矩阵转换为坐标映射,通过坐标运算获取邻域,还得处理Maybe类型的查找逻辑。我现在需要一个简洁、高效(O(log n))、全函数式的无坐标邻域函数,类型为a -> [a],要求能兼容上述DFS函数,同时满足以下约束:
- 含类型签名的总token数不超过100;
- 仅使用base、containers等Haskell常用标准库;
- 禁止使用
!!、head等部分函数; - 时间复杂度严格控制在O(log n)。
我猜测2D zipper结构可以实现这个方案,另外需要说明:此前相关问题的解决方案均与当前DFS函数不兼容。
内容的提问来源于stack exchange,提问作者Brendan Langfield
相关产品推荐
相关产品推荐

