JALLAT_backtracking.ml 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. let rec creer_nuage_aux x l = match x with
  2. | 0 -> []
  3. | _ -> (Random.float 10., Random.float 10.)::(creer_nuage_aux (x-1) l);;
  4. let creer_nuage x = creer_nuage_aux x [];;
  5. let nuage1_list = creer_nuage 10;;
  6. let nuage1_array = Array.of_list nuage1_list;;
  7. type nuage = float*float array;;
  8. let point_extremal nuage = let n = Array.length nuage and aux = ref (snd nuage.(0)) in
  9. for i = 1 to n-1 do
  10. for j = 0 to 1 do
  11. if snd (nuage.(i)) < !aux then aux := snd (nuage.(i))
  12. done;
  13. done;
  14. ;;
  15. let virage_a_gauche point1 point2 point3 = let (x1,y1) = point1 and (x2,y2) = point2 and (x3,y3) = point3 in
  16. ;;
  17. type element = Vide | Fixe of int | Variable of int;;
  18. let grille = element array array;;
  19. let taille = 9;;
  20. let int_of_element (elt:element):int =
  21. match elt with
  22. | Vide -> failwith "case vide"
  23. | Fixe x -> x
  24. | Variable x -> x
  25. ;;
  26. let case_suivante ((a,b):int*int): int*int =
  27. if b < taille - 1 then (a,b+1) else (a+1,0)
  28. ;;
  29. let case_precedente ((a,b):int*int):int*int =
  30. if b>0 then (a,b-1) else (a-1,taille-1)
  31. ;;
  32. let valeurs_interdites_ligne (g:grille) ((i,j):int*int) : int list =
  33. let l = ref [] in
  34. for y = 0 to taille - 1 do
  35. if (y<>j) && (g.(i)(y)<> Vide) then
  36. then l := (int_of_element g.(i).(y)) :: l
  37. done;
  38. !l
  39. ;;
  40. let valeurs_interdites_colonne (g:grille) ((i,j):int*int) : int list =
  41. let l = ref [] in
  42. for x = 0 to taille - 1 do
  43. if (x<>i) && (g.(x)(j)<> Vide) then
  44. then l := (int_of_element g.(x).(j)) :: l
  45. done;
  46. !l
  47. ;;
  48. let valeurs_interdites_blocs (g:grille) ((i,j):int*int) : int list =
  49. let l = ref [] and ib = 3 *(i/3) and jb = 3*(j/3) in
  50. for x = ib to ib+2 do
  51. for y = jb to jb+2 do
  52. if ((x,y)<>(i,j)) && (g.(x)(y)<> Vide) then
  53. then l := (int_of_element g.(x).(j)) :: l
  54. done;
  55. done;
  56. !l
  57. ;;
  58. let valeur_test (g:grille) ((i,j):int*int) : int list =
  59. let vil = valeurs_interdites_ligne g (i,j) and
  60. vib = valeurs_interdites_blocs g (i,j) and
  61. vic = valeurs_interdites_colonne g (i,j) and
  62. l = ref [] in
  63. for a = 1 to taille -1 do
  64. if not ((List.mem a vil) || (List.mem a vic) || (List.mem a vib)) then
  65. l:= a::!l
  66. done;
  67. !l
  68. ;;
  69. let est_fixe (g:grille) ((i,j):int*int):bool =
  70. match g.(i).(j) with
  71. | Fixe _ -> true
  72. | _ -> false
  73. ;;
  74. let sudoku g =
  75. let i = ref 0 and j = ref 0 and
  76. g_test = Array.make_matrix taille taille [] in
  77. if not (est_fixe g (0,0)) then
  78. g_test.(0).(0)<- valeur_test g (0,0);
  79. while (!i>-1) && (!i<taille) do
  80. if (est_fixe g (!i,!j))
  81. then
  82. begin
  83. let (x,y) = case_suivante (!i,!j) in
  84. if (x<taille) && (not(est_fixe g (x,y)))
  85. then g_test(!i).(!j)<- valeur_test g (x,y);
  86. i := x;
  87. j := y
  88. end
  89. else
  90. begin
  91. if (g_test.(!i).(!j) = [])
  92. then
  93. begin
  94. while (!i > -1) && (((est_fixe g (!i,!j))) || (g_test.(!i).(!j) = [])) do
  95. if not(est_fixe g (!i,!j)) then g.(!i).(!j)<- Vide
  96. let (x,y) = case_precedente (!i,!j) in
  97. i:=x;
  98. j:=y;
  99. done;
  100. end;
  101. else
  102. begin
  103. g.(!i).(!j) <- Variable(List.hd g_test.(!i).(!j));
  104. g_test.(!i).(!j) <- List.tl g_test.(!i).(!j);
  105. let (x,y) = case_suivante (!i,!j) in
  106. if (x<taille) && (not (est_fixe g (x,y)))
  107. then g_test.(x).(y) <- valeur_test g (x,y)
  108. i:=x;
  109. j:=y;
  110. end
  111. end
  112. done;
  113. g
  114. ;;