using System.Collections.Generic;
static int CountIslands(IEnumerable<Tuple<int, int>> points)
var offsets = new int[8,2] { {-1,-1}, {-1,0}, {-1,1}, {0,-1}, {0,1}, {1,-1}, {1,0}, {1,1} };
var pointTable = new HashSet<Tuple<int, int>>(points);
var stack = new Stack<Tuple<int, int>>();
while (pointTable.Count > 0)
stack.Push(pointTable.First());
while (stack.Count() > 0)
for(int i = 0; i < 8; i++)
stack.Push(Tuple.Create(p.Item1 + offsets[i,0], p.Item2 + offsets[i,1]));
public static void Main()
var points = new List<Tuple<int, int>>();
points.Add(Tuple.Create(19,9));
points.Add(Tuple.Create(11, 11));
points.Add(Tuple.Create(10, 10));
points.Add(Tuple.Create(10, 10));
points.Add(Tuple.Create(11, 10));
points.Add(Tuple.Create(20, 10));
points.Add(Tuple.Create(21, 12));
Console.WriteLine(CountIslands(points) + " Islands");