pretty DFS
This commit is contained in:
parent
9778738d4d
commit
ded82171ce
BIN
graphs.cmi
BIN
graphs.cmi
Binary file not shown.
BIN
graphs.cmo
BIN
graphs.cmo
Binary file not shown.
259
graphs.ml
259
graphs.ml
|
@ -252,6 +252,262 @@ let another_type_of_graph_printing (gr : type2graph) r d =
|
|||
done
|
||||
done ;
|
||||
|
||||
ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;;
|
||||
|
||||
(* ------------------------------------------------------------*)
|
||||
(* ------------------------------------------------------------*)
|
||||
(* ------------------------------------------------------------*)
|
||||
|
||||
let another_type_of_dfs (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
|
||||
|
||||
(* Now for the actual DFS *)
|
||||
let visited = Array.make_matrix gr.width gr.height false in
|
||||
|
||||
let rec explore i j =
|
||||
if visited.(i).(j) = false then begin
|
||||
visited.(i).(j) <- true;
|
||||
|
||||
draw_tile i j;
|
||||
|
||||
Unix.sleepf 0.8;
|
||||
|
||||
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 *)
|
||||
set_line_width 4;
|
||||
set_color black;
|
||||
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j-1))|] ;
|
||||
set_color colors.(i).(j);
|
||||
set_line_width 8;
|
||||
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|] ;
|
||||
|
||||
draw_tile i j;
|
||||
|
||||
explore (i-1) (j-1) ;
|
||||
end;
|
||||
|
||||
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) && (visited.(i-1).(j) = false) then begin (* O *)
|
||||
set_line_width 4;
|
||||
set_color black;
|
||||
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*j)|] ;
|
||||
set_color colors.(i).(j);
|
||||
set_line_width 8;
|
||||
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|] ;
|
||||
|
||||
draw_tile i j;
|
||||
|
||||
explore (i-1) j ;
|
||||
end;
|
||||
|
||||
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) && (visited.(i-1).(j+1) = false) then begin (* NO *)
|
||||
set_line_width 4;
|
||||
set_color black;
|
||||
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j+1))|] ;
|
||||
set_color colors.(i).(j);
|
||||
set_line_width 8;
|
||||
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|] ;
|
||||
|
||||
draw_tile i j;
|
||||
|
||||
explore (i-1) (j+1) ;
|
||||
end;
|
||||
|
||||
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) && (visited.(i).(j+1) = false) then begin (* N *)
|
||||
set_line_width 4;
|
||||
set_color black;
|
||||
draw_poly_line [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j+1))|] ;
|
||||
set_color colors.(i).(j);
|
||||
set_line_width 8;
|
||||
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|] ;
|
||||
|
||||
draw_tile i j;
|
||||
|
||||
explore i (j+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 *)
|
||||
set_line_width 4;
|
||||
set_color black;
|
||||
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j+1))|] ;
|
||||
set_color colors.(i).(j);
|
||||
set_line_width 8;
|
||||
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|] ;
|
||||
|
||||
draw_tile i j;
|
||||
|
||||
explore (i+1) (j+1) ;
|
||||
end;
|
||||
|
||||
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) && (visited.(i+1).(j) = false) then begin (* E *)
|
||||
set_line_width 4;
|
||||
set_color black;
|
||||
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*j)|] ;
|
||||
set_color colors.(i).(j);
|
||||
set_line_width 8;
|
||||
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|] ;
|
||||
|
||||
draw_tile i j;
|
||||
|
||||
explore (i+1) j ;
|
||||
end;
|
||||
|
||||
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) && (visited.(i+1).(j-1) = false) then begin (* SE *)
|
||||
set_line_width 4;
|
||||
set_color black;
|
||||
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j-1))|] ;
|
||||
set_color colors.(i).(j);
|
||||
set_line_width 8;
|
||||
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|] ;
|
||||
|
||||
draw_tile i j;
|
||||
|
||||
explore (i+1) (j-1) ;
|
||||
end;
|
||||
|
||||
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) && (visited.(i).(j-1) = false) then begin (* S *)
|
||||
set_line_width 4;
|
||||
set_color black;
|
||||
draw_poly_line [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j-1))|] ;
|
||||
set_color colors.(i).(j);
|
||||
set_line_width 8;
|
||||
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|] ;
|
||||
|
||||
draw_tile i j;
|
||||
|
||||
explore i (j-1) ;
|
||||
end;
|
||||
|
||||
end
|
||||
in
|
||||
|
||||
explore (gr.width/2) (gr.height/2);
|
||||
|
||||
(* ------------------------------------------------------------*)
|
||||
(* ------------------------------------------------------------*)
|
||||
(* ------------------------------------------------------------*)
|
||||
|
||||
ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;;
|
||||
(* ----------------------- Tests --------------------------- *)
|
||||
|
||||
|
@ -260,7 +516,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_graph_printing type2 35 75 ;;*)
|
||||
another_type_of_dfs type2 35 75 ;;
|
||||
|
||||
close_graph () ;;
|
||||
|
||||
|
|
Loading…
Reference in New Issue