题解 P1706 【全排列问题】

HoshinoTented

2019-08-24 06:33:55

Solution

# P1706 很简单的全排列问题,解决方式就是暴搜 ## 全排列 这里用的是 dfs ```haskell -- 排列 :: 列表 -> 列表的全排列 permutation :: [Int] -> [[Int]] permutation [] = [[]] -- 列表为空,返回一个空的全排列,注意不能是 [] permutation xs = foldr (\i x -> ((i:) <$> permutation (delete i xs)) ++ x) [] xs -- 如果不为空,就遍历列表内元素,并添加到 “删除这个元素之后的列表的全排列”之前 ``` 但事实上 `foldr` 的写法很丑。。 在我一番思索后,选择了列表生成器 ``` permutation xs = [x:y | x <- xs, y <- permutation (delete x xs)] ``` 这样就好看多了 ## [最终代码](https://github.com/HoshinoTented/LuoGu/blob/master/haskell/src/P1706.hs) ```haskell import Data.List (delete) permutation :: [Int] -> [[Int]] permutation [] = [[]] permutation xs = [x:y | x <- xs, y <- permutation (delete x xs)] -- foldr (\i x -> ((i:) <$> permutation (delete i xs)) ++ x) [] xs printArr :: [[Int]] -> IO () printArr [] = return () printArr (x:xs) = do foldr (\i m -> (putStr $ " " ++ show i) >> m) (return ()) x putStrLn "" printArr xs main :: IO () main = do n <- read <$> getLine printArr $ permutation [1..n] return () ```