コード例 #1
0
        public override void SolveMaze(Maze maze)
        {
            base.SolveMaze(maze);

            Datastructures.Queue <int> q = new Datastructures.Queue <int>();

            q.Enqueue(maze.start);

            while (!q.isEmpty)
            {
                current = q.Dequeue();

                if (current < 0)
                {
                    continue;
                }

                if (!Global.noDelay)
                {
                    while (!Global.doStep)
                    {
                    }
                }
                Global.doStep = false;

                iterations++;

                if (current == maze.end)
                {
                    maze.solved = true;
                    solving     = false;
                    return;
                }

                List <int> neighbours = maze.maze.GetAllNeighbours(current);
                foreach (int next in neighbours)
                {
                    if (maze.solved)
                    {
                        return;
                    }
                    if (!maze.IsEdge(current, next))
                    {
                        if (Length(current) < Length(next) || solution[next] == -1)
                        {
                            solution[next] = current;
                            q.Enqueue(next);
                        }
                    }
                }
            }
            solving = false;
        }
コード例 #2
0
        public override void SolveMaze(Maze maze)
        {
            Datastructures.Queue <int> q = new Datastructures.Queue <int>();

            for (current = 0; current < maze.maze.size; current++)
            {
                if (!Global.noDelay)
                {
                    while (!Global.doStep)
                    {
                    }
                }
                Global.doStep = false;

                if (current == maze.start || current == maze.end)
                {
                    continue;
                }

                iterations++;

                List <int> neighbours = maze.maze.GetAllNeighbours(current);
                int        count      = 0;

                foreach (int neighbour in neighbours)
                {
                    if (!maze.IsEdge(current, neighbour) && !deadEnds.Contains(current))
                    {
                        count++;
                    }
                }

                if (count == 1)
                {
                    deadEnds.Add(current);
                    q.Enqueue(current);
                }
            }

            while (!q.isEmpty)
            {
                if (!Global.noDelay)
                {
                    while (!Global.doStep)
                    {
                    }
                }
                Global.doStep = false;

                current = q.Dequeue();

                if (current == maze.start || current == maze.end)
                {
                    continue;
                }

                iterations++;

                List <int> neighbours = maze.maze.GetAllNeighbours(current);
                int        next       = -1;

                foreach (int neighbour in neighbours)
                {
                    if (neighbour == maze.end)
                    {
                        continue;
                    }
                    if (!maze.IsEdge(current, neighbour) && !deadEnds.Contains(neighbour))
                    {
                        List <int> neighbourNeighbours = maze.maze.GetAllNeighbours(neighbour);

                        int count = 0;

                        foreach (int i in neighbourNeighbours)
                        {
                            if (!maze.IsEdge(neighbour, i) && !deadEnds.Contains(i))
                            {
                                count++;
                            }
                        }

                        if (count == 1)
                        {
                            if (next == -1)
                            {
                                next = neighbour;
                            }
                            else
                            {
                                continue;
                            }
                        }
                    }
                }

                if (next == -1)
                {
                    continue;
                }

                deadEnds.Add(next);
                q.Enqueue(next);
            }
        }