示例#1
0
文件: Tree.cs 项目: ericoloewe/puzzle
        public PuzzleTreeNode <IPuzzle> Insert(IPuzzle data)
        {
            Root = new PuzzleTreeNode <IPuzzle>(data);

            AddInfoTo(Root);

            return(Root);
        }
示例#2
0
文件: Tree.cs 项目: ericoloewe/puzzle
        public PuzzleTreeNode <T> Insert(T data, PuzzleTreeNode <T> parent)
        {
            var newNode = new PuzzleTreeNode <T>(data);

            newNode.Parent = parent;
            parent.Children.Add(newNode);

            return(newNode);
        }
示例#3
0
文件: Tree.cs 项目: ericoloewe/puzzle
        public PuzzleTreeNode <IPuzzle> Insert(IPuzzle data, PuzzleTreeNode <IPuzzle> parent)
        {
            var newNode = new PuzzleTreeNode <IPuzzle>(data);

            AddInfoTo(newNode);
            newNode.Parent = parent;
            parent.Children.Add(newNode);

            return(newNode);
        }
示例#4
0
文件: Tree.cs 项目: ericoloewe/puzzle
        public IList <IPuzzle> GetNodePathToRoot(PuzzleTreeNode <IPuzzle> puzzleNode)
        {
            IList <IPuzzle> pathToRoot = new List <IPuzzle>();

            do
            {
                pathToRoot.Add(puzzleNode.Data);
                puzzleNode = puzzleNode.Parent;
            } while (puzzleNode != null);

            return(pathToRoot);
        }
        private PuzzleTreeNode <IPuzzle> StartToBuildPuzzleTree(PuzzleEvents events, PuzzleTreeNode <IPuzzle> parent)
        {
            var parentPuzzle = parent.Data;

            if (IsARepeatedPuzzle(parentPuzzle))
            {
                return(null);
            }

            AddToPuzzleRepeatedListIfNeed(parentPuzzle);

            foreach (var allowedMovement in parentPuzzle.AllowedMovements())
            {
                var puzzleChild = (Puzzle)parentPuzzle.Clone();

                Console.WriteLine($"allowedMovement: {allowedMovement}");
                puzzleChild.Move(allowedMovement);

                if (!IsARepeatedPuzzle(puzzleChild))
                {
                    var puzzleChildNode = tree.Insert(puzzleChild, parent);

                    if (puzzleChild.IsDone())
                    {
                        return(puzzleChildNode);
                    }

                    events.onStateChange.Invoke(puzzleChild);
                    var childrenResolution = StartToBuildPuzzleTree(events, puzzleChildNode);

                    if (childrenResolution != null)
                    {
                        return(childrenResolution);
                    }
                }
            }

            return(null);
        }
示例#6
0
文件: Tree.cs 项目: ericoloewe/puzzle
 private void AddInfoTo(PuzzleTreeNode <IPuzzle> node)
 {
     node.AmountOfPiecesOutOfOrder = node.Data.AmountOfPiecesOutOfOrder();
     node.MovementsToFinish        = node.Data.MovementsToFinishAllPieces();
 }
示例#7
0
文件: Tree.cs 项目: ericoloewe/puzzle
 public PuzzleTreeNode <T> Insert(T data)
 {
     return(Root = new PuzzleTreeNode <T>(data));
 }
示例#8
0
        private PuzzleTreeNode <IPuzzle> StartToBuildPuzzleTree(PuzzleEvents events, PuzzleTreeNode <IPuzzle> parent)
        {
            PuzzleTreeNode <IPuzzle> solution = null;
            var hasMoreItems       = true;
            var foundSolution      = false;
            var openedParents      = new Dictionary <string, PuzzleTreeNode <IPuzzle> >();
            var closedParents      = new Dictionary <string, PuzzleTreeNode <IPuzzle> >();
            var childRepeatControl = new Dictionary <string, PuzzleTreeNode <IPuzzle> >();
            var parentPuzzle       = parent.Data;
            var parentPuzzleString = parentPuzzle.ToString();

            if (parentPuzzle.IsDone())
            {
                solution = parent;

                return(solution);
            }

            openedParents[parentPuzzleString] = parent;

            while (hasMoreItems && !foundSolution)
            {
                foreach (var allowedMovement in parentPuzzle.AllowedMovements())
                {
                    var puzzleChild = (Puzzle)parentPuzzle.Clone();

                    puzzleChild.Move(allowedMovement);

                    var puzzleChildString  = puzzleChild.ToString();
                    var isARepeatedPuzzle  = childRepeatControl.ContainsKey(puzzleChildString);
                    var childWasAParent    = closedParents.ContainsKey(puzzleChildString);
                    var childWillBeAParent = openedParents.ContainsKey(puzzleChildString);

                    if (!childWasAParent || !childWillBeAParent || !isARepeatedPuzzle)
                    {
                        var puzzleChildNode = tree.Insert(puzzleChild, parent);

                        if (!childWasAParent)
                        {
                            openedParents[puzzleChildString] = puzzleChildNode;
                        }

                        if (!isARepeatedPuzzle)
                        {
                            if (puzzleChild.IsDone())
                            {
                                solution      = puzzleChildNode;
                                foundSolution = true;

                                return(puzzleChildNode);
                            }

                            events.onStateChange.Invoke(puzzleChild);
                            childRepeatControl[puzzleChildString] = puzzleChildNode;
                        }
                    }
                }

                openedParents.Remove(parentPuzzleString);
                closedParents[parentPuzzleString] = parent;

                if (!openedParents.Any())
                {
                    hasMoreItems = false;
                    break;
                }

                childRepeatControl[parentPuzzleString] = parent;
                parent             = GetBestNodeByHeuristic(openedParents);
                parentPuzzle       = parent.Data;
                parentPuzzleString = parentPuzzle.ToString();
            }

            return(solution);
        }
示例#9
0
        private PuzzleTreeNode <IPuzzle> StartToBuildPuzzleTree(PuzzleEvents events, PuzzleTreeNode <IPuzzle> parent)
        {
            PuzzleTreeNode <IPuzzle> nodeSolution = null;
            var hasMoreItems  = true;
            var foundSolution = false;
            var openedParents = new Dictionary <string, PuzzleTreeNode <IPuzzle> >();
            var closedParents = new Dictionary <string, PuzzleTreeNode <IPuzzle> >();
            var parentPuzzle  = parent.Data;

            if (parentPuzzle.IsDone())
            {
                foundSolution = true;
                return(parent);
            }

            openedParents.Add(parentPuzzle.ToString(), parent);

            while (hasMoreItems && !foundSolution)
            {
                foreach (var allowedMovement in parentPuzzle.AllowedMovements())
                {
                    var puzzleChild = (Puzzle)parentPuzzle.Clone();

                    puzzleChild.Move(allowedMovement);

                    if (!IsARepeatedPuzzle(puzzleChild))
                    {
                        var puzzleChildNode = tree.Insert(puzzleChild, parent);

                        if (puzzleChild.IsDone())
                        {
                            foundSolution = true;
                            return(puzzleChildNode);
                        }

                        events.onStateChange.Invoke(puzzleChild);
                        openedParents.Add(puzzleChild.ToString(), puzzleChildNode);
                        AddToPuzzleRepeatedListIfNeed(puzzleChild);
                    }
                }

                var parentPuzzleString = parentPuzzle.ToString();

                openedParents.Remove(parentPuzzleString);

                if (!closedParents.ContainsKey(parentPuzzleString))
                {
                    closedParents.Add(parentPuzzleString, parent);
                }

                if (openedParents.Count == 0)
                {
                    hasMoreItems = false;
                    break;
                }

                AddToPuzzleRepeatedListIfNeed(parentPuzzle);
                parent       = openedParents.First().Value;
                parentPuzzle = parent.Data;
            }

            return(nodeSolution);
        }