為了給出整體背景關系,我有一個大小為 N 的 2d 網格(大小已知但可以變化并且始終是一個正方形,即 x 軸 = y 軸)和我試圖在網格上找到的 M 個點(數量點是已知的,但它們的位置不知道)。我想遍歷所述網格的所有可能的解決方案。此外,點不必按特定順序排列,因此
[(1,1),(1,2)]
is the same as
[(1,2),(1,1)]
因此,例如假設網格是 2x2,它們是 2 點。那么所有可能的解決方案將是
[(1,1),(1,2)]
[(1,1),(2,1)]
[(1,1),(2,2)]
[(1,2),(2,1)]
...and so on...
我正在嘗試創建一個將這些輸出給我的函式。
我知道下面的函式可以為我創建一個完整的網格,但我不知道如何使用它來生成所有可能的點位置。以及這個網格一開始是否有用
createGrid :: Int -> [(Int, Int)]
createGrid num = [ (x,y) | x <- [1..num], y <- [1..num]]
任何幫助,將不勝感激
uj5u.com熱心網友回復:
聽起來您只想要一個從 N*M 個專案的串列(網格)中選擇 M 個專案的獨特方式的串列。您已經知道如何生成此串列,因此您需要的只是從串列中選擇 K 個專案的方法。這是一條人跡罕至的道路;例如,請參閱在 Haskell 中生成串列的唯一組合的函式。
一般來說,嘗試進行這種拆分是很有用的:將您的程式分成更小的部分,看看其中有多少是容易解決的。如果您嘗試在一個函式中一次性完成所有操作,您最終會重復作業,并且經常會得到一個難以閱讀的函式。
uj5u.com熱心網友回復:
對于給定的網格,如果m是0,那么我們回傳空串列,當m大于 時0,我們產生一個點并在串列的其余部分遞回,所以:
possibleGrids :: Int -> Int -> [[(Int, Int)]]
possibleGrids n mm = go mm 1 0
where go 0 _ _ = [[]]
go m i j = [(x, y) : tl | x <- [i .. n], y <- [1 .. n], x > i || y > j, tl <- go (m-1) x y]
這里的第一個引數是n,即網格的大小。第二個是m,要標記的點數。對于 2×2 網格,這給了我們:
ghci> possibleGrids 2 0
[[]]
ghci> possibleGrids 2 1
[[(1,1)],[(1,2)],[(2,1)],[(2,2)]]
ghci> possibleGrids 2 2
[[(1,1),(1,2)],[(1,1),(2,1)],[(1,1),(2,2)],[(1,2),(2,1)],[(1,2),(2,2)],[(2,1),(2,2)]]
該代碼使用對稱破壞,因此它不會標記兩次(或更多)同一點,也不會以不同的順序提供點串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/399709.html
標籤:哈斯克尔
