题解 P1706 【全排列问题】
HoshinoTented
2019-08-24 06:33:55
# 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 ()
```