public Coordinates Traceback(Coordinates coordinates)
        {
            if (coordinates.X > 0 || coordinates.Y > 0)
            {
                if (coordinates.Y == 0) // must be horizontal as we are on the top row
                {
                    TracebackPath.Add(Move.HorizontalMove);
                    return(Traceback(HorizontalMoveCoordinates(coordinates.X, coordinates.Y)));
                }
                if (coordinates.X == 0) // must be vertical as we are on left most column
                {
                    TracebackPath.Add(Move.VerticalMove);
                    return(Traceback(VerticalMoveCoordinates(coordinates.X, coordinates.Y)));
                }
                var verticalValue   = VerticalMoveValue(coordinates.X, coordinates.Y);
                var diagonalValue   = DiagonalMoveValue(coordinates.X, coordinates.Y);
                var horizontalValue = HorizontalMoveValue(coordinates.X, coordinates.Y);
                var currentValue    = Grid.GetValue(coordinates.X, coordinates.Y);

                if (currentValue == diagonalValue)
                {
                    TracebackPath.Add(Move.DiagonalMove);
                    return(Traceback(DiagonalMoveCoordinates(coordinates.X, coordinates.Y)));
                }

                //get rid of ones that do not differ by one
                verticalValue   = FindDifference(verticalValue, currentValue);
                diagonalValue   = FindDifference(diagonalValue, currentValue);
                horizontalValue = FindDifference(horizontalValue, currentValue);

                if (diagonalValue >= horizontalValue && diagonalValue >= verticalValue)
                {
                    TracebackPath.Add(Move.DiagonalMove);
                    return(Traceback(DiagonalMoveCoordinates(coordinates.X, coordinates.Y)));
                }
                if (verticalValue >= horizontalValue && verticalValue >= diagonalValue)
                {
                    TracebackPath.Add(Move.VerticalMove);
                    return(Traceback(VerticalMoveCoordinates(coordinates.X, coordinates.Y)));
                }
                else
                {
                    TracebackPath.Add(Move.HorizontalMove);
                    return(Traceback(HorizontalMoveCoordinates(coordinates.X, coordinates.Y)));
                }
            }
            return(new Coordinates(0, 0));
        }