Nếu bạn muốn sử dụng gói của tôi grid(userguide) đây là ví dụ để bạn bắt đầu. (Và nếu bạn không muốn sử dụng nó, bạn có thể thấy một số mã nguồn hữu ích.)
Tạo lưới có 4 hàng và 5 cột.
λ> :m + Math.Geometry.Grid
λ> let g = rectSquareGrid 4 5
λ> indices g
[(0,0),(0,1),(0,2),(0,3),(1,0),(1,1),(1,2),(1,3),(2,0),(2,1),(2,2),(2,3),(3,0),(3,1),(3,2),(3,3),(4,0),(4,1),(4,2),(4,3)]
Chúng tôi muốn có thể ánh xạ "giá trị tiền xu" vào vị trí lưới, vì vậy chúng tôi sẽ tạo GridMap.
λ> :m + Math.Geometry.GridMap
λ> let m = lazyGridMap g [5,4,3,8,6,0,2,1,0,7,0,1,9,4,3,2,3,4,0,9]
λ> m
lazyGridMap (rectSquareGrid 4 5) [5,4,3,8,6,0,2,1,0,7,0,1,9,4,3,2,3,4,0,9]
λ> toList m
[((0,0),5),((0,1),4),((0,2),3),((0,3),8),((1,0),6),((1,1),0),((1,2),2),((1,3),1),((2,0),0),((2,1),7),((2,2),0),((2,3),1),((3,0),9),((3,1),4),((3,2),3),((3,3),2),((4,0),3),((4,1),4),((4,2),0),((4,3),9)]
Chúng tôi có thể tìm ra những người hàng xóm của bất kỳ tế bào trong lưới, nhưng đối với ứng dụng của bạn, chúng tôi chạy vào một chút của một vấn đề: tôi loại RectSquareGrid không cho phép di chuyển theo đường chéo.
λ> neighbours (1,2) m
[(0,2),(1,3),(2,2),(1,1)]
Bây giờ, tôi muốn được hạnh phúc để tạo ra một loại mới của Grid
có thể đáp ứng nhu cầu của bạn . Ngoài ra, bạn có thể viết chức năng riêng của bạn trong đó sẽ bao gồm các nước láng giềng chéo:
λ> let neighbours2 (x, y) g = filter (`inGrid` g) [(x-1,y-1), (x-1,y), (x-1,y+1), (x,y-1), (x,y+1), (x+1,y-1), (x+1,y), (x+1,y+1)]
λ> neighbours2 (1,2) m
[(0,1),(0,2),(0,3),(1,1),(1,3),(2,1),(2,2),(2,3)]
Nhưng bạn chỉ quan tâm trong việc cho phép di chuyển lùi xuống, hoặc là thẳng xuống hoặc đường chéo, vì vậy đây là một chức năng hữu ích hơn:
λ> let allowedMoves (x, y) g = filter (`inGrid` g) [(x+1,y-1), (x+1,y), (x+1,y+1)]
λ> allowedMoves (1,2) m
[(2,1),(2,2),(2,3)]
Vì vậy, bây giờ chúng ta có thể viết một hàm cung cấp cho bạn tất cả các đường dẫn có thể có từ một chỉ mục nhất định đến hàng dưới cùng của lưới.
allPathsFrom a g | fst a == fst (size g) = [[a]]
| otherwise = Prelude.map (a:) xs
where xs = concatMap (\x -> allPathsFrom x g) ys
ys = allowedMoves a g
Ví dụ:
λ> allPathsFrom (0,1) m
[[(0,1),(1,0),(2,0),(3,0),(4,0)],[(0,1),(1,0),(2,0),(3,0),(4,1)],[(0,1),(1,0),(2,0),(3,1),(4,0)],[(0,1),(1,0),(2,0),(3,1),(4,1)],[(0,1),(1,0),(2,0),(3,1),(4,2)],[(0,1),(1,0),(2,1),(3,0),(4,0)],[(0,1),(1,0),(2,1),(3,0),(4,1)],[(0,1),(1,0),(2,1),(3,1),(4,0)],[(0,1),(1,0),(2,1),(3,1),(4,1)],[(0,1),(1,0),(2,1),(3,1),(4,2)],[(0,1),(1,0),(2,1),(3,2),(4,1)],[(0,1),(1,0),(2,1),(3,2),(4,2)],[(0,1),(1,0),(2,1),(3,2),(4,3)],[(0,1),(1,1),(2,0),(3,0),(4,0)],[(0,1),(1,1),(2,0),(3,0),(4,1)],[(0,1),(1,1),(2,0),(3,1),(4,0)],[(0,1),(1,1),(2,0),(3,1),(4,1)],[(0,1),(1,1),(2,0),(3,1),(4,2)],[(0,1),(1,1),(2,1),(3,0),(4,0)],[(0,1),(1,1),(2,1),(3,0),(4,1)],[(0,1),(1,1),(2,1),(3,1),(4,0)],[(0,1),(1,1),(2,1),(3,1),(4,1)],[(0,1),(1,1),(2,1),(3,1),(4,2)],[(0,1),(1,1),(2,1),(3,2),(4,1)],[(0,1),(1,1),(2,1),(3,2),(4,2)],[(0,1),(1,1),(2,1),(3,2),(4,3)],[(0,1),(1,1),(2,2),(3,1),(4,0)],[(0,1),(1,1),(2,2),(3,1),(4,1)],[(0,1),(1,1),(2,2),(3,1),(4,2)],[(0,1),(1,1),(2,2),(3,2),(4,1)],[(0,1),(1,1),(2,2),(3,2),(4,2)],[(0,1),(1,1),(2,2),(3,2),(4,3)],[(0,1),(1,1),(2,2),(3,3),(4,2)],[(0,1),(1,1),(2,2),(3,3),(4,3)],[(0,1),(1,2),(2,1),(3,0),(4,0)],[(0,1),(1,2),(2,1),(3,0),(4,1)],[(0,1),(1,2),(2,1),(3,1),(4,0)],[(0,1),(1,2),(2,1),(3,1),(4,1)],[(0,1),(1,2),(2,1),(3,1),(4,2)],[(0,1),(1,2),(2,1),(3,2),(4,1)],[(0,1),(1,2),(2,1),(3,2),(4,2)],[(0,1),(1,2),(2,1),(3,2),(4,3)],[(0,1),(1,2),(2,2),(3,1),(4,0)],[(0,1),(1,2),(2,2),(3,1),(4,1)],[(0,1),(1,2),(2,2),(3,1),(4,2)],[(0,1),(1,2),(2,2),(3,2),(4,1)],[(0,1),(1,2),(2,2),(3,2),(4,2)],[(0,1),(1,2),(2,2),(3,2),(4,3)],[(0,1),(1,2),(2,2),(3,3),(4,2)],[(0,1),(1,2),(2,2),(3,3),(4,3)],[(0,1),(1,2),(2,3),(3,2),(4,1)],[(0,1),(1,2),(2,3),(3,2),(4,2)],[(0,1),(1,2),(2,3),(3,2),(4,3)],[(0,1),(1,2),(2,3),(3,3),(4,2)],[(0,1),(1,2),(2,3),(3,3),(4,3)]]
Lưu ý rằng kể từ khi GridMap
s cũng Grid
s, chúng ta có thể gọi tất cả các chức năng nêu trên m
hoặc g
.
λ> allPathsFrom (0,1) m
Hãy cho tôi biết (amy tại nualeargais chấm ie) nếu bạn muốn tôi để thêm một mạng lưới cho phép di chuyển theo đường chéo để gói grid
tôi.
Việc này có phải là đường thẳng hoặc bạn có thể quyết định hướng sau mỗi lần di chuyển không? –
bạn cần phải tạo tất cả các đường dẫn có thể vì vậy nếu tôi bắt đầu ở hàng 1, vị trí 2, sau đó tôi có thể đi đến hàng 2, vị trí 1, 2, 3 và sau đó từ đó trở đi, cho mỗi vị trí có thể trong hàng 2, bạn có thể đi thẳng xuống, theo đường chéo trái và phải. – user2035972
Nếu nó giúp, đây là hình ảnh trông giống như trực quan: http: //postimage.org/image/yrnrv8y2p/ – user2035972