結果
問題 | No.48 ロボットの操縦 |
ユーザー |
|
提出日時 | 2016-06-27 23:36:24 |
言語 | OCaml (5.2.1) |
結果 |
AC
|
実行時間 | 2 ms / 5,000 ms |
コード長 | 2,260 bytes |
コンパイル時間 | 315 ms |
コンパイル使用メモリ | 20,992 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-10-08 23:47:34 |
合計ジャッジ時間 | 1,101 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 25 |
ソースコード
type dir = N | E | W | Slet move_with_dir (x, y) pitch = function| N -> (x, y + pitch)| W -> (x - pitch, y)| E -> (x + pitch, y)| S -> (x, y - pitch)let turn_for_x v current =let to_west = v < 0and to_east = v > 0 inmatch current with| N when to_east -> Some (E, 1)| N when to_west -> Some (W, 1)| S when to_east -> Some (E, 1)| S when to_west -> Some (W, 1)| E when to_west -> Some (W, 2)| W when to_east -> Some (E, 2)| _ -> Nonelet turn_for_y v current =let to_south = v < 0and to_north = v > 0 inmatch current with| E when to_south -> Some (S, 1)| E when to_north -> Some (N, 1)| W when to_south -> Some (S, 1)| W when to_north -> Some (N, 1)| N when to_south -> Some (S, 2)| S when to_north -> Some (N, 2)| _ -> Nonelet solve tag_x tag_y max_pitch =let move_to_x x dir =let dir, act_count =match turn_for_x tag_x dir with| None -> dir, 0| Some v -> v inlet quo = (abs tag_x) / max_pitchand rem = (abs tag_x) mod max_pitch inlet rem = if rem > 0 then 1 else 0 indir, (act_count + quo + rem)and move_to_y y dir =let dir, act_count =match turn_for_y tag_y dir with| None -> dir, 0| Some v -> v inlet quo = (abs tag_y) / max_pitchand rem = (abs tag_y) mod max_pitch inlet rem = if rem > 0 then 1 else 0 indir, (act_count + quo + rem)inlet rec solve' (x, y) dir count =if (x, y) = (tag_x, tag_y) then countelse if x = tag_x thenlet dir, act_count = move_to_y y dir insolve' (x, tag_y) dir (count + act_count)else if y = tag_y thenlet dir, act_count = move_to_x x dir insolve' (tag_x, y) dir (count + act_count)elselet dir_x, act_count_x = move_to_x x dirand dir_y, act_count_y = move_to_y y dir inif dir_y = dir thensolve' (x, tag_y) dir_y (count + act_count_y)elsesolve' (tag_x, y) dir_x (count + act_count_x)insolve' (0, 0) N 0let () =let x_pos = read_line () |> int_of_string inlet y_pos = read_line () |> int_of_string inlet max_movable = read_line () |> int_of_string inPrintf.printf "%d\n" (solve x_pos y_pos max_movable)