Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Data.List
  2. import Data.Array
  3. import qualified Data.Set as S
  4. import qualified Data.Map as M
  5. main = interact $ format . solve . parse
  6. format True = "POSSIBLE"
  7. format False = "IMPOSSIBLE"
  8. solve g0 = go S.empty [g0] where
  9.     go _ [] = False
  10.     go cl (s:q) | s `S.member` cl = go cl q
  11.                 | elems s == "12345678." = True
  12.                 | otherwise = go (S.insert s cl) (next s ++ q)
  13. next g = map (move g hole) (adj hole) where
  14.   Just hole = find ((== '.') . (g!)) (indices g)
  15. move g dst src = g // [(src,'.'),(dst,g!src)]
  16. adj (1,1) = [(2,3),(3,2)]
  17. adj (1,2) = [(3,1),(3,3)]
  18. adj (1,3) = [(2,1),(3,2)]
  19. adj (2,1) = [(1,3),(3,3)]
  20. adj (2,2) = []
  21. adj (2,3) = [(1,1),(3,1)]
  22. adj (3,1) = [(1,2),(2,3)]
  23. adj (3,2) = [(1,1),(1,3)]
  24. adj (3,3) = [(1,2),(2,1)]
  25. parse = listArray ((1,1),(3,3)) . concat . lines
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement