0

好的,我是 Haskell 的新手,需要帮助我了解解决问题的功能方法。

我有一份清单。更具体地说[[Char]]

我想以列表中的特定元素为目标,并查看元素的上方、下方和左侧和右侧的元素。

例如:

["-------",
 "-------",
 "---N---",
 "--WOE--",
 "---S---",
 "-------",
 "-------"]

O我要定位的元素在哪里,以及N,S,E,W直接围绕元素的元素O

我制作了一个获取(x,y)元素坐标的函数,O如下所示:

find :: Eq a => [[a]] -> a -> (Int,Int)
find [[]] _ = (-1,-1)
find (x:xs) el = findHelper (x:xs) (0,0,el)

findHelper :: Eq a => [[a]] -> (Int,Int,a) -> (Int,Int)
findHelper [[]] _ = (-1,-1)
findHelper (x:xs) (row,col,el)
    | x == [] = findHelper xs (row+1,0,el)
    | (head x) == el = (row,col)
    | otherwise = findHelper ((tail x) : xs) (row,col + 1,el)

(x,y)坐标系是 0 索引的。一旦我找到了我正在寻找的元素的位置,我就无法终生弄清楚,如何弄清楚它周围有哪些元素。

抱歉,如果这不是最清楚的问题,如果我错过了什么,我可以详细说明。

4

1 回答 1

2

您尝试做的事情并不总是可能的,因为列表没有固定的大小。但是,如果您可以确保这样做,则可以执行此操作,否则您将需要进行大量检查以防止出现问题。我将展示一种获取周围元素的方法,但是您必须构建一些额外的检查以确保它不会尝试查找例如超出范围的元素。

这应该会给你一个包含周围元素的列表:

findSurrounding :: [[a]] -> (Int, Int) -> [a]
findSurrounding matrix (x,y) = map (getElementAt matrix) positions
    where positions = [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]

getElementAt :: [[a]] -> (Int, Int) -> a
getElementAt matrix (x, y) = (matrix !! y) !! x

我没有测试代码,所以它可能需要一些调整,但它应该让你开始。

于 2013-11-09T23:00:21.397 回答