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()); }
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); }
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); }
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); }