我目前正在开展一个项目,该项目需要我从伦敦地下的给定车站找到多条路线。我的项目是创建路线。我创建了一个使用 DFS 和递归的方法。该方法接受起始站的名称、一个空列表和一个整数值。当我使用以下代码执行该方法时:
GetRoutes("HOLBORN", list, 4);
我在列表中得到以下结果
HOLBORN
CHANCERY LANE
ST PAULS
BANK
LIVERPOOL STREET
TOTTENHAM COURT ROAD
OXFORD CIRCUS
RUSSELL SQUARE
KINGS CROSS
COVENT GARDEN
列表中的第一个字符串显示有效路径:
HOLBORN => CHANCERY LANE => ST PAULS => BANK => LIVERPOOL STREET
但是,然后我需要它再次搜索替代路线,例如:
HOLBORN => CHANCERY LANE => ST PAULS => BANK => LONDON BRIDGE
这是有问题的方法:
public List<string> GetRoutes(string stationName, List<string> completeRoutes, int counter)
{
Stack<Node<TrainData>> s = new Stack<Node<TrainData>>();
s.Push(GetRootStationNode(stationName));
while (s.Count > 0)
{
var currentNode = s.Pop();
if(!VisitedStation(currentNode.State.StationName, completeRoutes))
{
completeRoutes.Add(currentNode.State.StationName);
}
var allPossibleStation = GetAllPossibleNextStations(currentNode.State.StationName);
foreach (var node in allPossibleStation)
{
if (counter > 0)
{
if (!node.Visited)
{
node.Visited = true;
s.Push(node);
counter--;
GetRoutes(node.State.StationName, completeRoutes, counter);
}
}
}
}
return completeRoutes;
}
这是检索特定站的所有子节点的 GetAllPossibleNextStations:
public List<Node<TrainData>> GetAllPossibleNextStations(string input)
{
var possibleStations = new List<TrainData>();
var NodeList = new List<Node<TrainData>>();
var stationsMatchingInput = from f in dbList
where f.StationName == input
select f;
foreach (var station in stationsMatchingInput)
{
var node = GetNextStation(station.PositionId);
if (node != null && (node.State.Line == station.Line))
{
NodeList.Add(node);
}
}
我似乎无法理解这个遍历业务,所以任何建议都会很棒。