Files
rose-ash/lib/ocaml/baseline/island_count.ml
giles 6d7df11224
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 22s
ocaml: phase 5.1 island_count.ml baseline (6x7 grid, 5 components)
Count 4-connected components of 1-cells via DFS flood from every
unvisited 1-cell.

Grid (1s shown as #):
  # # . . . # #
  # . . . # # .
  . . # # . . .
  . # # # . # #
  # . . . . # .
  # # . # # # .

Components:
  {(0,0),(0,1),(1,0)}
  {(0,5),(0,6),(1,4),(1,5)}
  {(2,2),(2,3),(3,1),(3,2),(3,3)}
  {(3,5),(3,6),(4,5),(5,3),(5,4),(5,5)}
  {(4,0),(5,0),(5,1)}
                              -> 5 islands

Complementary to flood_fill.ml (largest component); this counts
total components.

Tests recursive function returning () at early-exit branches,
ordered double-for entry pass triggering one fill per island root.

180 baseline programs total.
2026-05-11 02:04:08 +00:00

38 lines
829 B
OCaml

let h = 6
let w = 7
let grid = [|
[| 1; 1; 0; 0; 0; 1; 1 |];
[| 1; 0; 0; 0; 1; 1; 0 |];
[| 0; 0; 1; 1; 0; 0; 0 |];
[| 0; 1; 1; 1; 0; 1; 1 |];
[| 1; 0; 0; 0; 0; 1; 0 |];
[| 1; 1; 0; 1; 1; 1; 0 |]
|]
let rec fill visited r c =
if r < 0 || r >= h || c < 0 || c >= w then ()
else if visited.(r).(c) || grid.(r).(c) = 0 then ()
else begin
visited.(r).(c) <- true;
fill visited (r - 1) c;
fill visited (r + 1) c;
fill visited r (c - 1);
fill visited r (c + 1)
end
let count_islands () =
let visited = Array.init h (fun _ -> Array.make w false) in
let count = ref 0 in
for r = 0 to h - 1 do
for c = 0 to w - 1 do
if grid.(r).(c) = 1 && not visited.(r).(c) then begin
count := !count + 1;
fill visited r c
end
done
done;
!count
;;
count_islands ()