簡體   English   中英

如何在Haskell中從具有特定規則的列表中刪除項目?

[英]How do i remove items from a list with specific rules in haskell?

基本上我有一個8 x 8的國際象棋棋盤

chessboard = [(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(1,0),
(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(2,0),(2,1),(2,2),(2,3),   
(2,4),(2,5),(2,6),(2,7),(2,8),(3,0),(3,1),(3,2),(3,3),(3,4),(3,5),(3,6),
(3,7),(3,8),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(4,6),(4,7),(4,8),(5,0),
(5,1),(5,2),(5,3),(5,4),(5,5),(5,6),(5,7),(5,8),(6,0),(6,1),(6,2),(6,3),
(6,4),(6,5),(6,6),(6,7),(6,8),(7,0),(7,1),(7,2),(7,3),(7,4),(7,5),(7,6),
(7,7),(7,8),(8,0),(8,1),(8,2),(8,3),(8,4),(8,5),(8,6),(8,7),(8,8)]

我需要在棋盤上放置8個皇后,而每個皇后都不能殺死另一個皇后。 我想出了一種方法來執行此操作:例如,如果在(0,0)上放置一個女王,則不允許包含相同行或列的位置,因此我可以刪除(0,1),(0,2) ,(0,3)...(x,y + 1)和(1,0),(2,0),(3,0)...(x + 1,y)。 因此,如果我的皇后在(0,0)上,我如何刪除所有(x,y + 1),(x + 1,y),(x + 1,y + 1),(x- 1,y-1)? 我傾向於遞歸,但無法弄清楚。

您可以使用filter :: (a -> Bool) -> [a] -> [a] 請注意,第一個參數(謂詞)實際上決定了要保留的內容 不是要刪除的內容(因此,如果它表示True ,則意味着將元素放入結果列表中):

因此,為了刪除x = 0所有值,可以使用

filter (\(x,_) -> x /= 0) chessboard

或濾除y等於k所有元素:

filtery k = filter (\(_,y) -> y /= k)

您可以使用以下命令過濾掉攻擊位於(xq,yq)處的女王的所有元素:

filterqueen :: (Int,Int) -> [(Int,Int)] -> [(Int,Int)]
filterqueen (xq,yq) = filter noattack
    where noattack (x,y) = xq /= x && yq /= y && dx /= dy && dx /= -dy
              where dx = x-xq
                    dy = y-yq

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM