import qualified Data.Set as S main = interact $ (\n -> unlines . map (\l-> unwords . map (show . solve n l) $ [1..n-1]) $ [1..n-1]) . read solve::Int->Int->Int->Int solve n i j = s 0 ([(1,1)], S.fromList[(1,1)]) where s::Int->([(Int,Int)],S.Set(Int,Int))->Int s k (l,v) | (n,n) `S.member` v = k | null l = negate 1 | otherwise = s (k+1) $ b l v [] b::[(Int,Int)]->S.Set(Int,Int)->[(Int,Int)]->([(Int,Int)],S.Set(Int,Int)) b [] v c = (c, v) b (x:xs) v c = b xs (S.union v $ S.fromList l) $ c ++ l where l = filter (f v) (g x) f::S.Set(Int,Int)->(Int,Int)->Bool f v x@(i,j) | i < 1 || i > n || j < 1 || j > n = False | x `S.member` v = False | otherwise = True g::(Int,Int)->[(Int,Int)] g (ii, jj) = [(ii + iii, jj + jjj) | (iii, jjj) <- [(i,j),(-i,j),(i,-j),(-i,-j),(j,i),(-j,i),(j,-i),(-j,-i)]]