/// <summary>
        /// Calculate the Best Route
        /// </summary>
        /// <param name="mapPosition"></param>
        private void CalculateBestRoute(MapPosition mapPosition)
        {
            //Add value to Route
            RouteOption.Add(mapPosition.Value);

            //Load closer values
            MapPositionAroundValues mapPositionAroundValues = this.GetAroundValues(mapPosition);

            //Calculate next position
            MapPosition nextPosition = this.CalculateNextPosition(mapPositionAroundValues);

            //Validate next position
            if (nextPosition.Value > 0)
            {
                CalculateBestRoute(nextPosition);
            }
            else
            {
                RouteOptionList.Add(RouteOption);

                CompareRoutes();

                PrintBestRoute();
            }
        }
        /// <summary>
        /// Calculate next position
        /// </summary>
        /// <param name="mapPositionAroundValues"></param>
        /// <returns></returns>
        private MapPosition CalculateNextPosition(MapPositionAroundValues mapPositionAroundValues)
        {
            int a = mapPositionAroundValues.Leftvalue.Value;
            int b = mapPositionAroundValues.DownValue.Value;
            int c = mapPositionAroundValues.RightValue.Value;

            MapPosition MaxValue = new MapPosition();
            string      result   = "";

            if (a < b)
            {
                if (b < c)
                {
                    result = "c";
                }
                else
                {
                    result = "b";
                }
            }
            else if (a > b)
            {
                if (a < c)
                {
                    result = "c";
                }
                else
                {
                    result = "a";
                }
            }

            switch (result)
            {
            case "a":
                MaxValue = mapPositionAroundValues.Leftvalue;
                break;

            case "b":
                MaxValue = mapPositionAroundValues.DownValue;
                break;

            case "c":
                MaxValue = mapPositionAroundValues.RightValue;
                break;

            default:
                break;
            }

            return(MaxValue);
        }
        /// <summary>
        /// Load closer values
        /// </summary>
        /// <param name="rowMaxPosition"></param>
        /// <returns></returns>
        private MapPositionAroundValues GetAroundValues(MapPosition rowMaxPosition)
        {
            int x = rowMaxPosition.RowPosition;
            int y = rowMaxPosition.ColumnPosition;

            MapPositionAroundValues mapPositionAroundValues = new MapPositionAroundValues
            {
                Value = rowMaxPosition,

                UpValue = new MapPosition(x - 1 < 0 ? 0 : Map[(x - 1), y], (x - 1), y),

                DownValue = new MapPosition(x + 1 > (MapSize - 1) ? 0 : Map[(x + 1), y], (x + 1), y),

                Leftvalue = new MapPosition(y - 1 < 0 ? 0 : Map[x, (y - 1)], x, (y - 1)),

                RightValue = new MapPosition(y + 1 > (MapSize - 1) ? 0 : Map[x, (y + 1)], x, (y + 1))
            };

            return(mapPositionAroundValues);
        }