Ejemplo n.º 1
0
        public List <MazeField> Find(TwoDMaze maze)
        {
            var shortestPath = new ShortestPath <MazeField>();

            MazeField start = null, end = null;

            foreach (var mazeField in maze.Fields)
            {
                if (mazeField.FieldType == FieldType.Start)
                {
                    start = mazeField;
                }
                if (mazeField.FieldType == FieldType.End)
                {
                    end = mazeField;
                }
            }

            var graph = BuildGraphFromMaze(maze);

            var startGraphNode = graph.Vertices.First(v => v.Value == start);
            var endGraphNode   = graph.Vertices.First(v => v.Value == end);

            var shortestGraphPath = shortestPath.FindPath(graph, startGraphNode, endGraphNode);

            return(shortestGraphPath.Select(p => p.Value).ToList());
        }
Ejemplo n.º 2
0
        private TwoDMaze ReadMazeFromString(string mazeString)
        {
            TwoDMaze maze  = new TwoDMaze();
            var      lines = mazeString.Split(Environment.NewLine).Where(s => !string.IsNullOrEmpty(s)).ToList();

            maze.Fields = new MazeField[lines.Count, lines[0].Length];

            int i = 0, j = 0;

            foreach (var line in lines)
            {
                j = 0;
                foreach (char c in line.ToCharArray())
                {
                    if (c == '0')
                    {
                        maze.Fields[i, j] = new MazeField()
                        {
                            FieldType = FieldType.Clear, Label = $"{i},{j}"
                        }
                    }
                    ;

                    if (c == 'X')
                    {
                        maze.Fields[i, j] = new MazeField()
                        {
                            FieldType = FieldType.Obstacle, Label = $"X"
                        }
                    }
                    ;

                    if (c == 'S')
                    {
                        maze.Fields[i, j] = new MazeField()
                        {
                            FieldType = FieldType.Start, Label = $"S"
                        }
                    }
                    ;

                    if (c == 'E')
                    {
                        maze.Fields[i, j] = new MazeField()
                        {
                            FieldType = FieldType.End, Label = $"E"
                        }
                    }
                    ;

                    j++;
                }

                i++;
            }

            return(maze);
        }
Ejemplo n.º 3
0
        public void TestTwoDMazePathFinder()
        {
            TwoDMazePathFinder mazer = new TwoDMazePathFinder();

            string   mazeString = @"
S000X
X0X00
X00XX
X0X0E
X0X00
X000X";
            TwoDMaze m          = ReadMazeFromString(mazeString);

            List <MazeField> path = mazer.Find(m);

            Assert.Equal(11, path.Count);
        }
Ejemplo n.º 4
0
        private IGraph <MazeField> BuildGraphFromMaze(TwoDMaze maze)
        {
            GraphAdjList <MazeField> graph = new GraphAdjList <MazeField>();

            List <Vertex <MazeField> > vertices = new List <Vertex <MazeField> >();

            int W = maze.Fields.GetLength(0);
            int H = maze.Fields.GetLength(1);

            int[] ii = new[] { 0, 0, 1, -1 };
            int[] jj = new[] { 1, -1, 0, 0 };

            var verticeGrid = new Vertex <MazeField> [W, H];

            for (int i = 0; i < W; i++)
            {
                for (int j = 0; j < H; j++)
                {
                    if (maze.Fields[i, j].FieldType == FieldType.Obstacle)
                    {
                        continue;
                    }
                    verticeGrid[i, j] = new Vertex <MazeField>()
                    {
                        Value = maze.Fields[i, j]
                    };
                }
            }

            for (int i = 0; i < W; i++)
            {
                for (int j = 0; j < H; j++)
                {
                    if (maze.Fields[i, j].FieldType == FieldType.Obstacle)
                    {
                        continue;
                    }

                    for (int step = 0; step < 4; step++)
                    {
                        int nextX = i + ii[step];
                        int nextY = j + jj[step];

                        if (nextY >= H || nextY < 0)
                        {
                            continue;
                        }
                        if (nextX >= W || nextX < 0)
                        {
                            continue;
                        }

                        if (maze.Fields[nextX, nextY].FieldType == FieldType.Clear)
                        {
                            Edge <MazeField> edgeTo = new Edge <MazeField>()
                            {
                                From = verticeGrid[i, j],
                                To   = verticeGrid[nextX, nextY]
                            };

                            Edge <MazeField> edgeFrom = new Edge <MazeField>()
                            {
                                To   = verticeGrid[i, j],
                                From = verticeGrid[nextX, nextY]
                            };

                            graph.AddEdges(new [] { edgeFrom, edgeTo });
                        }
                    }

                    vertices.Add(verticeGrid[i, j]);
                }
            }

            graph.AddVertices(vertices);
            return(graph);
        }