コード例 #1
0
ファイル: PathFinder.cs プロジェクト: YiuWingTan/Raven
    public PathFinder()
    {
        bfs = new BFS();

        dfs = new DFS();

        dj = new Dijkstra();

        aStart = new AStart(AStartHeuristic.Euclid);
    }
コード例 #2
0
        // 参考 启发性搜索 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);
        }