let doIt () = let N = stdin.ReadLine () |> int let maxN = N * N let field = Array2D.zeroCreate N N let dxy = [| (1, 0); (0, 1); (-1, 0); (0, -1) |] let canMove x y dir = let dx, dy = dxy.[dir] let nx, ny = x + dx, y + dy nx >=0 && nx < N && ny >= 0 && ny < N && field.[ny, nx] = 0 let rec move x y n dir = if n > maxN then () else field.[y, x] <- n let nextDir = if canMove x y dir then dir else (dir + 1) % 4 let dx, dy = dxy.[nextDir] move (x + dx) (y + dy) (n + 1) nextDir move 0 0 1 0 let formatLine y = seq {for x in 0..(N - 1) -> sprintf "%03d" field.[y, x]} |> Seq.reduce (fun s1 s2 -> s1 + " " + s2) seq {for y in 0..(N - 1) -> formatLine y} |> Seq.iter (printfn "%s") doIt ()