(* Tentative de Résolution du Taquin ave A* *)

type taquin = { vide : int * int ; cases : int array array }

type deplacement = H | B | G | D

let taqWin = { vide = (0,0); cases = [| 
            [| 0; 1; 2; 3 |];
            [| 4; 5; 6; 7 |]; 
            [| 8; 9; 10; 11 |];
            [| 12; 13; 14; 15 |]; |]};;

(* taquins exemples *)

let taq1 = { vide = (0,1); cases = [|
          [| 1; 0; 2; 7 |];
          [| 4; 5; 3; 6 |];
          [| 8; 9; 10; 11 |];
          [| 12; 13; 14; 15 |]; |]};;

let taq2 = { vide = (1,1) ; cases = [|
          [| 4; 6; 1; 3 |];
          [| 8; 0; 2; 7 |];
          [| 10; 12; 14; 11 |];
          [| 9; 13; 5; 15 |]; |]};;

(* Fonctions utilitaires *)

let affiche_taquin taq =
  Printf.printf "-------------\n";
  for i = 0 to 3 do
    for j = 0 to 3 do
      let v = taq.cases.(i).(j) in
      if v = 0 then 
        Printf.printf "|  "
      else if  v < 10 then
        Printf.printf "| %d" v
      else
        Printf.printf "|%d" v
    done;
    Printf.printf "|\n"
  done;
  Printf.printf "-------------\n"
;;

affiche_taquin taqWin;;
affiche_taquin taq1;;
affiche_taquin taq2;;

(** Le jeu **)



(** L' Heuristique **)



(** La File de priorité : liste (element, prio) trié par priorité croissante **)

type 'a fileprio = { mutable liste : ('a * int) list };;


(* let testFP () =
  let fp = creeFP() in
  ajouterFP fp "test" 3;
  ajouterFP fp "ceci" 1;
  ajouterFP fp "est un" 2;
  while not (estVideFP fp) do
    let s = extraireMinFP fp in print_endline s
  done;; *)



(** Les associations : taquin ->  distance, deplacement **)





(** Algo A* **)

exception Success;;



(* Resolution *)