public void Build(Grid grid) { if (grid == null) { return; } int unvisitedCount = grid.UsedCells() - 1; int switchPoint = 2 * grid.UsedCells() / 3; Cell current = grid.RandomCell(); // AldousBorder for first third while (unvisitedCount > switchPoint) { var neighbors = current.Neighbors; Cell neighbour = neighbors.Sample(); if (neighbour.Links.IsEmpty()) { current.Link(neighbour); unvisitedCount--; } current = neighbour; } // and finish with Wilson var unvisited = new CellCollection(); foreach (Cell cell in grid.GetCells()) { if ((cell != null) && cell.Links.IsEmpty()) { unvisited.Add(cell); } } while (!unvisited.IsEmpty()) { Cell cell = unvisited.Sample(); List <Cell> path = new List <Cell>(); path.Add(cell); while (unvisited.Contains(cell)) { cell = cell.Neighbors.Sample(); int position = path.IndexOf(cell); if (position >= 0) { path.RemoveRange(position + 1, path.Count - position - 1); } else { path.Add(cell); } } for (int i = 0; i < path.Count - 1; i++) { path[i].Link(path[i + 1]); unvisited.Remove(path[i]); } } }