以下に示すように、既知のポイントからルートを選択してみたいと思います。しかし、たとえばポイント 2 から 8 までの適切なルート チェーンを取得することはできません。この試行によると、ルート 1-ルート 2 とルート 3 が選択されますが、実際にはルート 1 とルート 3 のみである必要があり、別の例ではポイント 1 からポイント 11 まで、私の試行は結果のすべてのルートを与えます。どうすれば不要なルートをなくすことができるでしょうか。このトライアルで可能でしょうか、それとも見方を変えるべきでしょうか?
static void Main(string[] args)
{
var route1 = new List<int> { 1, 2, 3, 4 };
var route2 = new List<int> { 1, 5, 6, 7 };
var route3 = new List<int> { 1, 8, 9, 10 };
var route4 = new List<int> { 10, 11, 12, 13 };
List<List<int>> routeList = new List<List<int>>();
routeList.Add(route1);
routeList.Add(route2);
routeList.Add(route3);
routeList.Add(route4);
int start = 3;
int end = 9;
var vistedRoutes = new List<List<int>>();
foreach(var route in routeList.FindAll(r => r.Contains(start)))
{
vistedRoutes.Add(route);
routeList.Remove(route);
FindPath(vistedRoutes, routeList, start, end);
if (vistedRoutes.Last().Contains(end))
{
break;
}
}
Console.WriteLine("done");
}
static void FindPath(List<List<int>> visitedRoutes, List<List<int>> remainingRoutes, int start, int end)
{
if (visitedRoutes.Last().Contains(end))
{
return;
}
for (int i = 0; i < remainingRoutes.Count; i++ )
{
var route = remainingRoutes[i];
foreach (var point in route)
{
if (visitedRoutes.Last().Contains(point))
{
visitedRoutes.Add(route);
var newRemainingRoutes = new List<List<int>>(remainingRoutes);
newRemainingRoutes.Remove(route);
FindPath(visitedRoutes, newRemainingRoutes, start, end);
if (visitedRoutes.Last().Contains(end))
{
return;
}
else
{
visitedRoutes.Remove(route);
}
}
}
}
}