public PathFinder() { bfs = new BFS(); dfs = new DFS(); dj = new Dijkstra(); aStart = new AStart(AStartHeuristic.Euclid); }
// 参考 启发性搜索 A*算法 // f(n) = g(n) + h(n) // f(n) 为最小代价 // g(n) 为初始状态到当前状态的代价 // h(n) 为当前状态到目标状态的代价 public static int OpenLock(string[] deadends, string target) { if (target == "0000") { return(0); } HashSet <string> dead = deadends.ToHashSet(); if (dead.Contains("0000")) { return(-1); } Heap <AStart> heap = new Heap <AStart>(false); heap.Insert(new AStart("0000", target, 0)); HashSet <string> seen = new HashSet <string>(); seen.Add("0000"); while (!heap.Empty) { AStart node = heap.Pop(); foreach (var nextStatus in Get(node.Status)) { if (!seen.Contains(nextStatus) && !dead.Contains(nextStatus)) { if (nextStatus == target) { return(node.G + 1); } heap.Insert(new AStart(nextStatus, target, node.G + 1)); seen.Add(nextStatus); } } } return(-1); }