public void GeneratePaths()
        {
            _Grid = ConstructDefaultGrid(_SquareSize);
              CoordinatePath coordinatePath = new CoordinatePath();
              _CoordinatePaths.Add(coordinatePath);

              RecursivePaths(new Coordinates(0, 0), coordinatePath);
              PrintOutResults();
        }
        public CoordinatePath Branch()
        {
            CoordinatePath newCoordinates = new CoordinatePath();

              List<Coordinates> coordiantes = new List<Coordinates>();
              foreach (var coord in this._Coordinates)
              {
            coordiantes.Add(new Coordinates(coord.XCoordinate, coord.YCoordinate));
              }

              newCoordinates._Coordinates = coordiantes;
              return newCoordinates;
        }
        private Coordinates[] GenerateNewValidCoordinates(Coordinates coordinate, CoordinatePath coordinatePath)
        {
            List<Coordinates> validCoordiantes = new List<Coordinates>();
              Coordinates[] newCordinates = GetNewValidCoordinates(coordinate);
              foreach (var coord in newCordinates)
              {

            if (!IsCoordinateAlreadyVisitedOnPath(coord, coordinatePath))
            {
              validCoordiantes.Add(coord);
            }
              }
              if (validCoordiantes.Count() != 0)
              {
            return validCoordiantes.ToArray();
              }
              else
              {
            return null;
              }
        }
 private void AddCoordinateVisitOnPath(Coordinates coordinate, CoordinatePath coordinatePath)
 {
     coordinatePath.AddCoordinate(coordinate);
 }
        private void RecursivePaths(Coordinates coordinate,CoordinatePath coordinatePath)
        {
            if (IsCoordinateAlreadyVisitedOnPath(coordinate, coordinatePath))
              {
            return;
              }

              AddCoordinateVisitOnPath(coordinate, coordinatePath);

              Coordinates[] newCoordinates = GenerateNewValidCoordinates(coordinate, coordinatePath);

              if (newCoordinates == null)
              {
            return;
              }

              Console.WriteLine("number of choices is" + newCoordinates.Length.ToString());
              CoordinatePath tmp =  coordinatePath.Branch();
              for (int i = 0; i < newCoordinates.Length; i++)
            {
            if (i == 1)
            {
            }

            //this is the first one
            CoordinatePath cordinatePathToPassOn;
            if (i == 0)
            {
              cordinatePathToPassOn = coordinatePath;
            }
            else
            {
              CoordinatePath path = tmp.Branch();
              _CoordinatePaths.Add(path);
              cordinatePathToPassOn = path;
            }

            RecursivePaths(newCoordinates[i], cordinatePathToPassOn);
              }
        }
 private bool IsCoordinateAlreadyVisitedOnPath(Coordinates coordiante, CoordinatePath coordinatePath)
 {
     if (coordinatePath.IsCoordinateOnPath(coordiante))
     return true;
       else
     return false;
 }