private static IEnumerable <List <Cave> > VisitAll(Cave cave, Dictionary <Cave, int> visited = null) { if (visited == null) { visited = new Dictionary <Cave, int>(); } if (cave.Id == "end") { yield return(new List <Cave>() { cave }); yield break; } if (!cave.CanVisit(visited)) { yield break; } if (!cave.IsBigCave) { var count = visited.TryGetDef(cave, 0) + 1; visited[cave] = count; } foreach (var neighbour in cave.Neighbours.Where(n => n.Id != "start")) { var dic = new Dictionary <Cave, int>(visited); var paths = VisitAll(neighbour, dic); foreach (var path in paths) { path.Add(cave); yield return(path); } } }