# LeetCode Most Stones Removed with Same Row or Column in F#

·

## URL

Most Stones Removed with Same Row or Column - LeetCode

## Code

https://github.com/syohex/dotnet-study/tree/master/fsharp/leetcode/challenge/202408/most_stones_removed_with_same_row_or_column/main.fsx

let removeStones (stones: (int * int) list) : int =
let len = List.length stones

let toGraph (stones: (int * int)[]) =
let acc = Array.init len (fun _ -> [])

for i in 0 .. (len - 1) do
for j in (i + 1) .. (len - 1) do
if fst stones.[i] = fst stones.[j] || snd stones.[i] = snd stones.[j] then
acc.[i] <- j :: acc.[i]
acc.[j] <- i :: acc.[j]

acc

let rec markCycleGraph q (graph: int list[]) visited =
match q with
| [] -> visited
| h :: t ->
let visited = Set.add h visited
let nexts = graph.[h] |> List.filter (fun n -> not <| Set.contains n visited)
markCycleGraph (t @ nexts) graph visited

let rec countCycleGraph i graph visited acc =
if i >= len then
acc
elif Set.contains i visited then
countCycleGraph (i + 1) graph visited acc
else
let visited = markCycleGraph [ i ] graph visited
countCycleGraph (i + 1) graph visited (acc + 1)

let stones = List.toArray stones
let graph = toGraph stones
let cycleGraphs = countCycleGraph 0 graph Set.empty 0

len - cycleGraphs