public void Add(GraphNode <T> node) { AdjacentNodes.Add(node); }
public void AddAdjacent(Node newEnd, RegularExpressionToken token, bool isRepeat = false) { var adj = new NodeAdjacent(newEnd, token, isRepeat); AdjacentNodes.Add(adj); }
public static void Main(string[] args) { var startingPosition = 0; var destinationPosition = 12; var wall1 = 4; var wall2 = 5; var wall3 = 6; var wall4 = 13; var wall5 = 14; var wall6 = 15; var maze = new Dictionary <int, string>(); // populate the 2d grid with ".", "W", "S", "D" // 1 - populate with "." (empty) var counter = 0; for (var x = 0; x < gridXSize; x++) { for (var y = 0; y < gridYSize; y++) { maze.Add(counter, emptyMarker); counter += 1; } } // add walls and stuff... // insert "S" as a marker for a starting position if (maze.ContainsKey(startingPosition)) { maze[startingPosition] = startMarker; } // insert "D" as a marker for a destination position if (maze.ContainsKey(destinationPosition)) { maze[destinationPosition] = destinationMarker; } // insert "X" as a marker for a wall maze[wall1] = wallMarker; maze[wall2] = wallMarker; maze[wall3] = wallMarker; maze[wall4] = wallMarker; maze[wall5] = wallMarker; maze[wall6] = wallMarker; // the "maze" has now been completed // go through the maze, starting at top row/top left aka 0.0 and start adding vertices // a vertex is to be added if its index translated into coordinates is in the grid (valid) // and if it is not a wall // then its neighbours need to be evaluated and added as well var pathList = new List <string>(); var q = new Queue <Vertex>(); var myIndex = 0; var myCoordinates = findCoordinate(myIndex, gridXSize, gridYSize); var originatingVertex = new Vertex(myCoordinates); var finalListOfVertices = new List <Vertex>(); q.Enqueue(originatingVertex); while (q.Count > 0) { var localVertexFromQ = q.Dequeue(); myCoordinates = findCoordinate(localVertexFromQ.GetIndex(gridXSize), gridXSize, gridYSize); var adjNodes = new AdjacentNodes(localVertexFromQ.GetIndex(gridXSize)); // Explore North var myCoordinate = localVertexFromQ.getCoordinates(); var northernCoordinateY = myCoordinate.y - 1; var northernCoordinateX = myCoordinate.x; var isNorthernValid = checkIfCoordinatesAreValid(maze, northernCoordinateX, northernCoordinateY); var adjacentVertex = new Vertex(new Coordinate(northernCoordinateX, northernCoordinateY)); switch (isNorthernValid) { case "B": break; case "Valid": maze[adjacentVertex.GetIndex(gridXSize)] = visitedMarker; q.Enqueue(adjacentVertex); pathList.Add("N"); adjNodes.addAdjacentVertex(adjacentVertex); break; case "X": // do nothing, its a wall... maze[adjacentVertex.GetIndex(gridXSize)] = visitedMarker; break; case "S": maze[adjacentVertex.GetIndex(gridXSize)] = visitedMarker; break; case "D": // need to return the path taken pathList.Add("N"); break; case ".": maze[adjacentVertex.GetIndex(gridXSize)] = visitedMarker; q.Enqueue(adjacentVertex); pathList.Add("N"); adjNodes.addAdjacentVertex(adjacentVertex); break; case "V": // do nothing, it has been visited already... break; } // Explore West var westernCoordinateX = myCoordinates.x - 1; var westernCoordinateY = myCoordinates.y; var isWesternValid = checkIfCoordinatesAreValid(maze, westernCoordinateX, westernCoordinateY); adjacentVertex = new Vertex(new Coordinate(westernCoordinateX, westernCoordinateY)); switch (isWesternValid) { case "B": break; case "Valid": maze[adjacentVertex.GetIndex(gridXSize)] = visitedMarker; q.Enqueue(adjacentVertex); adjNodes.addAdjacentVertex(adjacentVertex); pathList.Add("W"); break; case "X": // do nothing, its a wall... maze[adjacentVertex.GetIndex(gridXSize)] = visitedMarker; break; case "S": maze[adjacentVertex.GetIndex(gridXSize)] = visitedMarker; break; case "D": // need to return the path taken pathList.Add("W"); break; case ".": maze[adjacentVertex.GetIndex(gridXSize)] = visitedMarker; q.Enqueue(adjacentVertex); adjNodes.addAdjacentVertex(adjacentVertex); pathList.Add("W"); break; case "V": break; } // Explore South var southCoordinateY = myCoordinates.y + 1; var southCoordinateX = myCoordinates.x; var issouthValid = checkIfCoordinatesAreValid(maze, southCoordinateX, southCoordinateY); adjacentVertex = new Vertex(new Coordinate(southCoordinateX, southCoordinateY)); switch (issouthValid) { case "B": break; case "Valid": maze[adjacentVertex.GetIndex(gridXSize)] = visitedMarker; q.Enqueue(adjacentVertex); adjNodes.addAdjacentVertex(adjacentVertex); pathList.Add("S"); break; case "X": // do nothing, its a wall... maze[adjacentVertex.GetIndex(gridXSize)] = visitedMarker; break; case "S": maze[adjacentVertex.GetIndex(gridXSize)] = visitedMarker; break; case "D": // need to return the path taken pathList.Add("S"); break; case ".": maze[adjacentVertex.GetIndex(gridXSize)] = visitedMarker; q.Enqueue(adjacentVertex); adjNodes.addAdjacentVertex(adjacentVertex); pathList.Add("S"); break; case "V": break; } // Explore East var easternCoordinateX = myCoordinates.x + 1; var easternCoordinateY = myCoordinates.y; var isEasternValid = checkIfCoordinatesAreValid(maze, easternCoordinateX, easternCoordinateY); adjacentVertex = new Vertex(new Coordinate(easternCoordinateX, easternCoordinateY)); switch (isEasternValid) { case "B": break; case "Valid": maze[adjacentVertex.GetIndex(gridXSize)] = visitedMarker; q.Enqueue(adjacentVertex); adjNodes.addAdjacentVertex(adjacentVertex); pathList.Add("E"); break; case "X": // do nothing, its a wall... maze[adjacentVertex.GetIndex(gridXSize)] = visitedMarker; break; case "S": maze[adjacentVertex.GetIndex(gridXSize)] = visitedMarker; break; case "D": // need to return the path taken pathList.Add("E"); break; case ".": maze[adjacentVertex.GetIndex(gridXSize)] = visitedMarker; q.Enqueue(adjacentVertex); adjNodes.addAdjacentVertex(adjacentVertex); pathList.Add("E"); break; case "V": break; } localVertexFromQ.addAdjacentNodes(adjNodes); finalListOfVertices.Add(localVertexFromQ); var r = pathList.ToArray(); } }