using System.Collections.Generic;
public static void Main()
var cityA = new City(new Location(0, 0));
var cityB = new City(new Location(1, 1));
var cityC = new City(new Location(2, 1));
var cityD = new City(new Location(3, 1));
var cityE = new City(new Location(4, 2));
var cityF = new City(new Location(5, 3));
cityA.AddConnection(cityB);
cityB.AddConnection(cityC);
cityB.AddConnection(cityE);
cityC.AddConnection(cityD);
cityC.AddConnection(cityE);
cityE.AddConnection(cityF);
var path = cityA.GetPathTo(cityF);
Console.WriteLine("Path: " + path.GetReadableString());
Console.WriteLine("Distance: " + path.CalculateDistance());
public Location Location { get; private set; }
public List<City> Connections { get; private set; }
public City(Location location)
Connections = new List<City>();
public void AddConnection(City city)
if (!Connections.Contains(city))
if (!city.Connections.Contains(this))
city.AddConnection(this);
public Path GetPathTo(City city)
var visitedCities = new List<City>();
var citiesBuffer = new Queue<City>();
citiesBuffer.Enqueue(this);
while (citiesBuffer.TryDequeue(out City picked))
if (picked.Connections.FirstOrDefault(x => x == city) != null)
visitedCities.Add(picked);
foreach (var notVisitedCity in picked.Connections.Where(x => !visitedCities.Contains(x)))
citiesBuffer.Enqueue(notVisitedCity);
public int X { get; private set; }
public int Y { get; private set; }
public Location(int x, int y)
public double DistanceTo(Location location)
return Math.Sqrt(Math.Pow((location.X - X), 2) + Math.Pow((location.Y - Y), 2));
public List<City> Cities { get; private set; }
Cities = new List<City>();
public void Add(City city)
public double CalculateDistance()
var citiesArray = Cities.ToArray();
for (int i = 0; i < citiesArray.Length - 1; i++)
sum += citiesArray[i].Location.DistanceTo(citiesArray[i+1].Location);
public string GetReadableString()
var citiesArray = Cities.ToArray();
for (int i = 0; i < citiesArray.Length; i++)
buffer += $"[{citiesArray[i].Location.X},{citiesArray[i].Location.X}]";
if (i < citiesArray.Length - 1)