我在
haskell中实现这个.
https://www.cs.bu.edu/teaching/alg/maze/
当达到“目标”时我能够到达获取列表但是如果目标不可访问,则列表不会更新.例如
...#@ !!!#@
..#.. !!#..
.##.# it should return !##.#
...#. !!!#.
我的代码如下
path maze x y
| x >= length (head maze) = (False, maze)
| y >= length maze = (False, maze)
| x < 0 = (False, maze)
| y < 0 = (False,maze)
| check maze x y '+' = (False, maze)
| check maze x y '#' = (False,maze)
| check maze x y '!' = (False, maze)
| check maze x y 'G' = (True,maze)
| fst east = (True,snd east)
| fst south = (True, snd south)
| fst west = (True, snd west)
| fst north = (True, snd north)
| fst noWay = (True, snd noWay)
| otherwise = (False, maze)
where
noWay = path (changeVal maze x y '!') x (y+1)
north = path(changeVal maze x y '+') x (y-1)
south = path (changeVal maze x y '+') x (y+1)
east = path (changeVal maze x y '+') (x+1) y
west = path (changeVal maze x y '+') (x-1) y
我没有得到结果.我是Haskell的新手,任何人都可以给我一个提升,这样我就可以解决这个愚蠢的问题.
最佳答案 你的问题的原因很快就会出现
| otherwise = (False, maze)
使用原始迷宫而不是返回更新的迷宫.但是,即使用snd noWay替换它也不会给你想要的输出. (我认为它只会标记出你的起点向南的部分.)
存在一个更大的问题:当继续下一个递归步骤时,您的函数不会保留上一步的标记,而是再次从原始迷宫开始.相反,下一个递归步骤需要从前一个产生的最终迷宫标记开始.例如. (当你的守卫向东走 – >向南 – >西向 – >向北)你需要向南离开东边的地方,有类似的东西
south = path (snd east) x (y+1)
如果你同样修正所有方向,那么你不需要noWay. (在这一点上没有任何未标记的地方可供检查.)相反,如果北方案例失败,那么它将标记除初始点以外的所有内容,所以你可以做
| otherwise = (False, changeVal (snd north) x y '!')