Example #1
0
        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);
                }
            }
        }