codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
-- knight moves type KnightPos = (Int,Int) moveKnight :: KnightPos -> [KnightPos] moveKnight (c, r) = filter onBoard [(c + 2, r + 1), (c + 2, r - 1), (c - 2, r + 1), (c - 2, r - 1), (c + 1, r + 2), (c + 1, r - 2), (c - 1, r + 2), (c - 1, r - 2)] where onBoard = \(c',r') -> c' `elem` [1..8] && r' `elem` [1..8] type Path = [KnightPos] nKnightMoves :: Int -> KnightPos -> [Path] nKnightMoves n pos | n == 0 = return [] | otherwise = do ps <- map return (moveKnight pos) ps' <- nKnightMoves (n - 1) (last ps) return (ps ++ ps') pathsTo :: Int -> KnightPos -> KnightPos -> [Path] pathsTo n start end = filter ((==end) . last) $ nKnightMoves n start main = let start = (8,8) end = (1,1) n = 6 in do putStrLn $ "To reach " ++ show end ++ " from " ++ show start ++ " in " ++ show n ++ " moves:" mapM_ putStrLn $ map show $ pathsTo n start end
Private
[
?
]
Run code
Submit