예제 #1
0
파일: DeadEndFill.cs 프로젝트: sLill/Maze
        protected override bool Search()
        {
            // Dead-end filling is an algorithm that finds its' solution through filling/or removing all dead-ends leaving only the solution remaining untouched
            int NodeCount = Map.Nodes.Sum(x => x.Value.Count);

            while (true)
            {
                Parallel.ForEach(Map.Nodes, row =>
                {
                    var DeadEndNodes = new Stack <MapNode>(Map.Nodes[row.Key].Where(x => x.Value.ConnectedNodes == 1 &&
                                                                                    x.Value.Position.ToString() != Map.StartNodePosition.ToString() &&
                                                                                    x.Value.Position.ToString() != Map.EndNodePosition.ToString()).Select(x => x.Value));

                    while (DeadEndNodes.Count() > 0)
                    {
                        RemoveDeadEnd(Map.Nodes, DeadEndNodes.Pop().Position);
                    }
                });


                //Map RevisedMap = new Map(FullPath);
                //RevisedMap.InitializeAsync().Wait();

                MapNode EndNode = this.Map.Nodes[Map.EndNodePosition.X][Map.EndNodePosition.Y];
                //Parallel.ForEach(Map.Nodes, row =>
                foreach (var row in Map.Nodes)
                {
                    foreach (var nodePosition in row.Value.Values.Select(x => x.Position))
                    {
                        EndNode.AppendPointToPath(nodePosition);
                    }
                }
                ;
            }

            return(base.Search());
        }