Advertisement
Guest User

Untitled

a guest
Jan 19th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 2.68 KB | None | 0 0
  1. let graphe == int list vect;;
  2.  
  3. let rec list_iter f l = match l with
  4.  [] -> ()
  5.  | t::q -> f t ; list_iter f q;;
  6.  
  7. type sommet = C | I | T;;
  8.  
  9. let parcours_profondeur graphe x =
  10.    let etats = make_vect (vect_length graphe) false in
  11.     let rec parcours x =
  12.         if not etats.(x)
  13.         then begin
  14.             etats.(x) <- true;
  15.             list_iter parcours graphe.(x)
  16.         end
  17.     in parcours x;;
  18.    
  19. let parcours_profondeur graphe f x0 =
  20.     let etats = make_vect (vect_length graphe) I in
  21.     etats.(x0) <- C;
  22.     let a_visiter = stack__new () in
  23.     stack__push x0 a_visiter;
  24.     while stack__length a_visiter > 0 do
  25.         let x = stack__pop a_visiter in
  26.         let rec decouvre_voisins l =
  27.             match l with
  28.             [] -> ()
  29.             | y::q -> if etats.(y) = I
  30.                         then begin
  31.                                 etats.(y) <- C;
  32.                                 stack__push y a_visiter
  33.                         end; decouvre_voisins q
  34.         in f x; etats.(x) <- T; decouvre_voisins graphe.(x)
  35.     done;;
  36.  
  37. let parcours_largeur graphe f x0 =
  38.     let etats = make_vect (vect_length graphe) I in
  39.     etats.(x0) <- C;
  40.     let a_visiter = queue__new () in
  41.     queue__add x0 a_visiter;
  42.     while queue__length a_visiter > 0 do
  43.         let x = queue__take a_visiter in
  44.         let rec decouvre_voisins l =
  45.             match l with
  46.             [] -> ()
  47.             | y::q -> if etats.(y) = I
  48.                         then begin
  49.                                 etats.(y) <- C;
  50.                                 queue__add y a_visiter
  51.                         end; decouvre_voisins q
  52.         in f x; etats.(x) <- T; decouvre_voisins graphe.(x)
  53.     done;;
  54.  
  55.  
  56. let graphe_grille n =
  57.     let n2= n * n in
  58.     let g = make_vect n2 [] in
  59.     let sommet (i,j) = i + n * j in
  60.     for i = 0 to n-1 do
  61.         for j = 0 to n-1 do
  62.             let l = ref [] in
  63.             if j > 0
  64.             then l := sommet (i,j-1)::!l;
  65.             if i > 0
  66.             then l := sommet (i-1,j)::!l;
  67.             if j < n-1
  68.             then l := sommet (i,j+1)::!l;
  69.             if i < n-1
  70.             then l := sommet (i+1,j)::!l;
  71.             g.(sommet (i,j)) <- !l
  72.         done;
  73.     done;
  74.     g;;
  75.  
  76. #open "graphics";;
  77. let _ =
  78.     open_graph " 500x500";
  79.     let g = graphe_grille 500 in
  80.     parcours_aleatoire g
  81.         (fun n -> plot (n mod 500) (n / 500))
  82.         (250+500*250);;
  83.  
  84. let rec extrait l i = match l with
  85.     [] -> failwith "list vide"
  86.     | t::q -> if i = 0 then (t, q)
  87.         else let x, l2 = extrait q (i-1) in
  88.             x, t::l2;;
  89.  
  90. let parcours_aleatoire graphe f x0 =
  91.     let etats = make_vect (vect_length graphe) I in
  92.     etats.(x0) <- C;
  93.     let a_visiter = ref [x0] in
  94.     let retire () = let i = random__int (list_length !a_visiter) in
  95.         let x, l = extrait !a_visiter i in
  96.         a_visiter := l;
  97.         x
  98.     in
  99.     while list_length !a_visiter > 0 do
  100.         let x = retire () in
  101.         let rec decouvre_voisins l =
  102.             match l with
  103.             [] -> ()
  104.             | y::q -> if etats.(y) = I
  105.                         then begin
  106.                                 etats.(y) <- C;
  107.                                 a_visiter := y :: !a_visiter
  108.                         end; decouvre_voisins q
  109.         in f x; etats.(x) <- T; decouvre_voisins graphe.(x)
  110.     done;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement