module Problems.P91 (knightsTour, closedKnightsTour, printKnightsTour) where
import qualified Data.Map.Strict as Map
import qualified Solutions.P91 as Solution
knightsTour :: Int -> (Int,Int) -> Maybe [(Int,Int)]
knightsTour :: Int -> (Int, Int) -> Maybe [(Int, Int)]
knightsTour = Int -> (Int, Int) -> Maybe [(Int, Int)]
Solution.knightsTour
closedKnightsTour :: Int -> Maybe [(Int,Int)]
closedKnightsTour :: Int -> Maybe [(Int, Int)]
closedKnightsTour = Int -> Maybe [(Int, Int)]
Solution.closedKnightsTour
printKnightsTour :: Maybe [(Int,Int)] -> IO ()
printKnightsTour :: Maybe [(Int, Int)] -> IO ()
printKnightsTour Maybe [(Int, Int)]
Nothing = forall (m :: * -> *) a. Monad m => a -> m a
return ()
printKnightsTour (Just [(Int, Int)]
path) = forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (String -> IO ()
putStrLn forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String
line) [Int
1..Int
n]
where order :: Map (Int, Int) Int
order = forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList forall a b. (a -> b) -> a -> b
$ forall a b. [a] -> [b] -> [(a, b)]
zip [(Int, Int)]
path [Int
1..(Int
nforall a. Num a => a -> a -> a
*Int
n)]
line :: Int -> String
line Int
y = [String] -> String
unwords forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (forall {a}. Show a => a -> String
showInt forall b c a. (b -> c) -> (a -> b) -> a -> c
. (\Int
x -> Map (Int, Int) Int
order forall k a. Ord k => Map k a -> k -> a
Map.! (Int
x,Int
y))) [Int
1..Int
n]
showInt :: a -> String
showInt a
k = forall a. Int -> a -> [a]
replicate (Int
width forall a. Num a => a -> a -> a
- forall (t :: * -> *) a. Foldable t => t a -> Int
length (forall {a}. Show a => a -> String
show a
k)) Char
' ' forall a. [a] -> [a] -> [a]
++ forall {a}. Show a => a -> String
show a
k
width :: Int
width = forall (t :: * -> *) a. Foldable t => t a -> Int
length (forall {a}. Show a => a -> String
show forall a b. (a -> b) -> a -> b
$ Int
nforall a. Num a => a -> a -> a
*Int
n)
l :: Int
l = forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Int, Int)]
path
n :: Int
n = forall a. [a] -> a
head forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [a]
takeWhile (\Int
k -> Int
kforall a. Num a => a -> a -> a
*Int
k forall a. Eq a => a -> a -> Bool
== Int
l) forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [a]
dropWhile (\Int
k -> Int
kforall a. Num a => a -> a -> a
*Int
k forall a. Ord a => a -> a -> Bool
< Int
l) [Int
1..]