diff --git a/a.out b/a.out index 99d1635..6f84fb8 100755 Binary files a/a.out and b/a.out differ diff --git a/graphs.cmi b/graphs.cmi index d1c3772..441676d 100644 Binary files a/graphs.cmi and b/graphs.cmi differ diff --git a/graphs.cmo b/graphs.cmo index fc37db3..f1e8a14 100644 Binary files a/graphs.cmo and b/graphs.cmo differ diff --git a/graphs.ml b/graphs.ml index d343e9d..a8bfb8e 100644 --- a/graphs.ml +++ b/graphs.ml @@ -1,5 +1,19 @@ 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 () ;; let pi = 3.14159265358979343 ;; @@ -385,12 +399,17 @@ let another_type_of_dfs (gr : type2graph) r d = (* Now for the actual DFS *) 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 visited.(i).(j) <- true; 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; 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; - explore (i-1) (j-1) ; + explore (i-1) (j-1) (depth+1) ; end; 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; - explore (i-1) j ; + explore (i-1) j (depth+1); end; 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; - explore (i-1) (j+1) ; + explore (i-1) (j+1) (depth+1); end; 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; - explore i (j+1) ; + explore i (j+1) (depth+1); 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 *) @@ -457,7 +476,7 @@ let another_type_of_dfs (gr : type2graph) r d = draw_tile i j; - explore (i+1) (j+1) ; + explore (i+1) (j+1) (depth+1); end; 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; - explore (i+1) j ; + explore (i+1) j (depth+1); end; 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; - explore (i+1) (j-1) ; + explore (i+1) (j-1) (depth+1); end; 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; - explore i (j-1) ; + explore i (j-1) (depth+1); end; end 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) ;; + +(* ------------------------------------------------------------*) +(* ------------------------------------------------------------*) +(* ------------------------------------------------------------*) + +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 --------------------------- *) open_graph " 1200x800" ;; @@ -517,7 +738,8 @@ set_window_title "Graphs" ;; let type2 = generate_type2_graph 8 6 40 1 1 ;; (*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 () ;;