BFS implemented

This commit is contained in:
Alexandre 2024-06-02 15:21:12 +02:00
parent ded82171ce
commit 80dd15b8b0
4 changed files with 237 additions and 15 deletions

BIN
a.out

Binary file not shown.

Binary file not shown.

Binary file not shown.

252
graphs.ml
View File

@ -1,5 +1,19 @@
open Graphics ;; open Graphics ;;
(* SOMMAIRE
- misc functions : 20 ~ 65
- main function : 68 - 120
- type 2 printing: 122 - 270
- DFS : 275 - 530 (yes the function is that big)
*)
Random.self_init () ;; Random.self_init () ;;
let pi = 3.14159265358979343 ;; let pi = 3.14159265358979343 ;;
@ -385,12 +399,17 @@ let another_type_of_dfs (gr : type2graph) r d =
(* Now for the actual DFS *) (* Now for the actual DFS *)
let visited = Array.make_matrix gr.width gr.height false in let visited = Array.make_matrix gr.width gr.height false in
let rec explore i j = let rec explore i j depth =
if visited.(i).(j) = false then begin if visited.(i).(j) = false then begin
visited.(i).(j) <- true; visited.(i).(j) <- true;
draw_tile i j; draw_tile i j;
set_color white;
fill_circle (1200-r) (800-r) r;
set_color black;
draw_integer (1200-r) (800-r) depth r;
Unix.sleepf 0.8; Unix.sleepf 0.8;
let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*j)) in let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*j)) in
@ -405,7 +424,7 @@ let another_type_of_dfs (gr : type2graph) r d =
draw_tile i j; draw_tile i j;
explore (i-1) (j-1) ; explore (i-1) (j-1) (depth+1) ;
end; end;
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) && (visited.(i-1).(j) = false) then begin (* O *) if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) && (visited.(i-1).(j) = false) then begin (* O *)
@ -418,7 +437,7 @@ let another_type_of_dfs (gr : type2graph) r d =
draw_tile i j; draw_tile i j;
explore (i-1) j ; explore (i-1) j (depth+1);
end; end;
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) && (visited.(i-1).(j+1) = false) then begin (* NO *) if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) && (visited.(i-1).(j+1) = false) then begin (* NO *)
@ -431,7 +450,7 @@ let another_type_of_dfs (gr : type2graph) r d =
draw_tile i j; draw_tile i j;
explore (i-1) (j+1) ; explore (i-1) (j+1) (depth+1);
end; end;
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) && (visited.(i).(j+1) = false) then begin (* N *) if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) && (visited.(i).(j+1) = false) then begin (* N *)
@ -444,7 +463,7 @@ let another_type_of_dfs (gr : type2graph) r d =
draw_tile i j; draw_tile i j;
explore i (j+1) ; explore i (j+1) (depth+1);
end; end;
if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) && (visited.(i+1).(j+1) = false) then begin (* NE *) if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) && (visited.(i+1).(j+1) = false) then begin (* NE *)
@ -457,7 +476,7 @@ let another_type_of_dfs (gr : type2graph) r d =
draw_tile i j; draw_tile i j;
explore (i+1) (j+1) ; explore (i+1) (j+1) (depth+1);
end; end;
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) && (visited.(i+1).(j) = false) then begin (* E *) if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) && (visited.(i+1).(j) = false) then begin (* E *)
@ -470,7 +489,7 @@ let another_type_of_dfs (gr : type2graph) r d =
draw_tile i j; draw_tile i j;
explore (i+1) j ; explore (i+1) j (depth+1);
end; end;
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) && (visited.(i+1).(j-1) = false) then begin (* SE *) if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) && (visited.(i+1).(j-1) = false) then begin (* SE *)
@ -483,7 +502,7 @@ let another_type_of_dfs (gr : type2graph) r d =
draw_tile i j; draw_tile i j;
explore (i+1) (j-1) ; explore (i+1) (j-1) (depth+1);
end; end;
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) && (visited.(i).(j-1) = false) then begin (* S *) if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) && (visited.(i).(j-1) = false) then begin (* S *)
@ -496,19 +515,221 @@ let another_type_of_dfs (gr : type2graph) r d =
draw_tile i j; draw_tile i j;
explore i (j-1) ; explore i (j-1) (depth+1);
end; end;
end end
in in
explore (gr.width/2) (gr.height/2); explore (gr.width/2) (gr.height/2) 0;
(* ------------------------------------------------------------*)
(* ------------------------------------------------------------*)
(* ------------------------------------------------------------*)
ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;; ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;;
(* ------------------------------------------------------------*)
(* ------------------------------------------------------------*)
(* ------------------------------------------------------------*)
let another_type_of_bfs (gr : type2graph) r d =
let colors = Array.make_matrix gr.width gr.height (rgb 0 0 0) in
for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do
if (i*gr.width + j) mod 6 = 0 then
colors.(i).(j) <- rgb 0 0 200
else if (i*gr.width + j) mod 6 = 1 then
colors.(i).(j) <- rgb 0 200 0
else if (i*gr.width + j) mod 6 = 2 then
colors.(i).(j) <- rgb 0 200 200
else if (i*gr.width + j) mod 6 = 3 then
colors.(i).(j) <- rgb 200 0 0
else if (i*gr.width + j) mod 6 = 4 then
colors.(i).(j) <- rgb 200 0 200
else
colors.(i).(j) <- rgb 200 200 0
done
done;
set_line_width 4;
set_color (rgb 192 192 192) ;
for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do
let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*j)) in
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j-1))|] ;
end;
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*j)|] ;
end;
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j+1))|] ;
end;
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *)
draw_poly_line [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j+1))|] ;
end;
if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j+1))|] ;
end;
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*j)|] ;
end;
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j-1))|] ;
end;
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *)
draw_poly_line [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j-1))|] ;
end;
done
done;
set_line_width 8;
for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do
let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*j)) in
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|] ;
end;
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|] ;
end;
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|] ;
end;
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|] ;
end;
if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|] ;
end;
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|] ;
end;
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|] ;
end;
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|] ;
end;
done
done;
set_line_width 5;
for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do
set_color (rgb 192 192 192) ;
fill_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ;
set_color (rgb 100 100 100) ;
draw_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ;
draw_integer (r + (2*r + d)*i) (r + (2*r + d)*j) gr.g.(i).(j).tag r
done
done ;
let draw_tile i j =
set_line_width 5;
set_color (rgb 48 48 48) ;
fill_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ;
set_color black;
draw_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ;
set_color colors.(i).(j);
draw_integer (r + (2*r + d)*i) (r + (2*r + d)*j) gr.g.(i).(j).tag r ;
in
(* Actual BFS *)
let pq = Queue.create () in
Queue.add (0, gr.width/2, gr.height/2, gr.width/2, gr.height/2, [||], [||]) pq ;
let visited = Array.make_matrix gr.width gr.height false in
try
while true do
let (depth, i0, j0, i, j, path_arr, bigpath_arr) = Queue.take pq in
if visited.(i).(j) = false then begin
set_line_width 4;
set_color black;
draw_poly_line path_arr ;
set_color colors.(i).(j);
set_line_width 8;
draw_poly_line bigpath_arr ;
draw_tile i j;
set_color colors.(i0).(j0) ;
draw_tile i0 j0;
visited.(i).(j) <- true;
set_color white;
fill_circle (1200-r) (800-r) r;
set_color black;
draw_integer (1200-r) (800-r) depth r;
Unix.sleepf 0.5;
let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*j)) in
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) && (visited.(i-1).(j-1) = false) then begin (* SO *)
Queue.add (depth+1, i, j, i-1, j-1, [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|]) pq;
end;
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) && (visited.(i-1).(j) = false) then begin (* O *)
Queue.add (depth+1, i, j, i-1, j, [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*j)|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|]) pq;
end;
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) && (visited.(i-1).(j+1) = false) then begin (* NO *)
Queue.add (depth+1, i, j, i-1, j+1, [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|]) pq;
end;
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) && (visited.(i).(j+1) = false) then begin (* N *)
Queue.add (depth+1, i, j, i, j+1, [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|]) pq;
end;
if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) && (visited.(i+1).(j+1) = false) then begin (* NE *)
Queue.add (depth+1, i, j, i+1, j+1, [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|]) pq;
end;
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) && (visited.(i+1).(j) = false) then begin (* E *)
Queue.add (depth+1, i, j, i+1, j, [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*j)|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|]) pq;
end;
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) && (visited.(i+1).(j-1) = false) then begin (* SE *)
Queue.add (depth+1, i, j, i+1, j-1, [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|]) pq;
end;
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) && (visited.(i).(j-1) = false) then begin (* S *)
Queue.add (depth+1, i, j, i, j-1, [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|]) pq;
end
end;
done;
()
with
| Stdlib.Queue.Empty -> ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;;
(* ------------------------------------------------------------*)
(* ------------------------------------------------------------*)
(* ------------------------------------------------------------*)
(* ----------------------- Tests --------------------------- *) (* ----------------------- Tests --------------------------- *)
open_graph " 1200x800" ;; open_graph " 1200x800" ;;
@ -517,7 +738,8 @@ set_window_title "Graphs" ;;
let type2 = generate_type2_graph 8 6 40 1 1 ;; let type2 = generate_type2_graph 8 6 40 1 1 ;;
(*another_type_of_graph_printing type2 35 75 ;;*) (*another_type_of_graph_printing type2 35 75 ;;*)
another_type_of_dfs type2 35 75 ;; (*another_type_of_dfs type2 35 75 ;;*)
another_type_of_bfs type2 35 75 ;;
close_graph () ;; close_graph () ;;