1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
type passage = Visite | Libre
type echiquier = passage array array
(*echiquier vide aux dimensions strictement positives *)
let ech_vide l c : echiquier =
assert ((l > 0) & (c > 0));
Array.make_matrix l c Libre
let dim_ech (e : echiquier) =
let nl = Array.length e in
let nc = Array.length (e.(0)) in
(nl, nc)
type pos = int * int
let pos_valide (e : echiquier) ((pl, pc):pos) =
let nl, nc = dim_ech e in
(0 <= pl) & (pl < nl) & (0 <= pc) & (pc < nc)
let pos_libre (e : echiquier) ((pl, pc):pos) =
e.(pl).(pc) = Libre
let visite_pos (e : echiquier) ((pl, pc):pos) =
e.(pl).(pc) <- Visite
let libere_pos (e : echiquier) ((pl, pc):pos) =
e.(pl).(pc) <- Libre
type deplacement = int * int
let (==>) ((pl, pc) : pos) ((dl, dc) : deplacement) : pos =
(pl + dl, pc + dc)
let depls_cav : deplacement list =
[(1,2); (1, -2); (-1, 2); (-1, -2); (2, 1); (2, -1); (-2, 1); (-2, -1)]
let pos_accessibles (e:echiquier) (p : pos) =
let lp = List.map ((==>) p) depls_cav in
List.filter (fun p -> (pos_valide e p && pos_libre e p)) lp
let tri_pos (e:echiquier) (lp : pos list) =
let lp_nb = List.map (fun p -> (p, List.length (pos_accessibles e p))) lp in
let lp_nb_sorted = List.sort (fun (_, nb1) (_, nb2) -> compare nb1 nb2) lp_nb in
List.map fst lp_nb_sorted |
Partager