private Couple <int> AStarTreeSearch()
        {
            Console.WriteLine("A* Tree Search:");

            SortedList <AStarTreeNode> openedNodes = new SortedList <AStarTreeNode>()
            {
                new AStarTreeNode(distanceMethod, 0, startPosition)
            };
            int minSteps      = -1;
            int examinedNodes = 0;

            while (openedNodes.Count > 0)
            {
                examinedNodes++;
                AStarTreeNode currentNode = openedNodes[0];
                openedNodes.RemoveAt(0);
                if (IsGoal(currentNode))
                {
                    minSteps = currentNode.DistanceFromRoot;
                    break;
                }
                openedNodes.AddAll(GetSuccessors(currentNode));
            }
            return(new Couple <int>(minSteps, examinedNodes));
        }
        private List <AStarGraphNode> GetSuccessors(AStarTreeNode node)
        {
            Couple <int>          pos           = node.Coorditates;
            List <AStarGraphNode> successors    = new List <AStarGraphNode>();
            List <AStarGraphNode> nextPositions = new List <AStarGraphNode>
            {
                new AStarGraphNode(distanceMethod, node.DistanceFromRoot + 1, new Couple <int>(pos.First + 1, pos.Second)),
                new AStarGraphNode(distanceMethod, node.DistanceFromRoot + 1, new Couple <int>(pos.First - 1, pos.Second)),
                new AStarGraphNode(distanceMethod, node.DistanceFromRoot + 1, new Couple <int>(pos.First, pos.Second + 1)),
                new AStarGraphNode(distanceMethod, node.DistanceFromRoot + 1, new Couple <int>(pos.First, pos.Second - 1))
            };

            foreach (AStarGraphNode newPos in nextPositions)
            {
                if (IsValidPosition(newPos.Coorditates))
                {
                    successors.Add(newPos);
                }
            }

            return(successors);
        }
 private int GetHeuristicDistance(AStarTreeNode node) => node.DistanceFromRoot + GetManhattanDistance(node.Coorditates);
 private bool IsGoal(AStarTreeNode node) => endPosition == node.Coorditates;