using SimpleCore; using System.Collections.Generic; namespace StandardScene.Magnetic.Tasking { internal static class Fass2PathFinder { public static List GetSitesBetweenBfs(int startSiteId, int endSiteId) { if (startSiteId == endSiteId) { return new List { startSiteId }; } var adjacency = BuildSiteAdjacency(); var visited = new HashSet { startSiteId }; var queue = new Queue>(); queue.Enqueue(new List { startSiteId }); while (queue.Count > 0) { var path = queue.Dequeue(); var current = path[path.Count - 1]; if (current == endSiteId) { return path; } if (!adjacency.TryGetValue(current, out var neighbors)) { continue; } foreach (var neighbor in neighbors) { if (visited.Contains(neighbor)) { continue; } visited.Add(neighbor); var nextPath = new List(path) { neighbor }; queue.Enqueue(nextPath); } } return new List(); } private static Dictionary> BuildSiteAdjacency() { var adjacency = new Dictionary>(); foreach (var track in SimpleLib.GetAllTracks()) { var siteA = track.siteA; var siteB = track.siteB; switch (track.direction) { case 0: AddAdjacency(adjacency, siteA, siteB); AddAdjacency(adjacency, siteB, siteA); break; case 1: AddAdjacency(adjacency, siteA, siteB); break; case 2: AddAdjacency(adjacency, siteB, siteA); break; default: AddAdjacency(adjacency, siteA, siteB); AddAdjacency(adjacency, siteB, siteA); break; } } return adjacency; } private static void AddAdjacency(Dictionary> adjacency, int from, int to) { if (!adjacency.TryGetValue(from, out var set)) { set = new HashSet(); adjacency[from] = set; } set.Add(to); } } }