private static List <MazeCell> FindShortestPath(MazeCell entryCell, MazeCell exitCell, MazeCell currentCell, Queue <MazeCell> mazeQueue, MazeCell[,] mazeArray) { currentCell = entryCell; mazeQueue.Enqueue(currentCell); while (mazeQueue.Count > 0) { currentCell = MazeQueue.Dequeue(); mazeArray[currentCell.Y, currentCell.X].IsVisited = true; if (currentCell == exitCell) { break; } if (mazeArray[currentCell.Y - 1, currentCell.X].IsVisited == false) { mazeArray[currentCell.Y - 1, currentCell.X].Parent = mazeArray[currentCell.Y, currentCell.X]; mazeQueue.Enqueue(mazeArray[currentCell.Y - 1, currentCell.X]); } if (mazeArray[currentCell.Y + 1, currentCell.X].IsVisited == false) { mazeArray[currentCell.Y + 1, currentCell.X].Parent = mazeArray[currentCell.Y, currentCell.X]; mazeQueue.Enqueue(mazeArray[currentCell.Y + 1, currentCell.X]); } if (mazeArray[currentCell.Y, currentCell.X - 1].IsVisited == false) { mazeArray[currentCell.Y, currentCell.X - 1].Parent = mazeArray[currentCell.Y, currentCell.X]; mazeQueue.Enqueue(mazeArray[currentCell.Y, currentCell.X - 1]); } if (mazeArray[currentCell.Y, currentCell.X + 1].IsVisited == false) { mazeArray[currentCell.Y, currentCell.X + 1].Parent = mazeArray[currentCell.Y, currentCell.X]; mazeQueue.Enqueue(mazeArray[currentCell.Y, currentCell.X + 1]); } } var mazePath = new List <MazeCell>(); var start = mazeArray[entryCell.Y, entryCell.X]; var exit = mazeArray[exitCell.Y, exitCell.X]; mazePath.Add(exit); while (exit != start) { if (exit.Parent == null) { return(null); } mazePath.Add(exit.Parent); exit = exit.Parent; } mazePath.Reverse(); mazePath.RemoveAt(0); return(mazePath); }
public static void GetPathForVisualization(List <MazeCell> mazePath) { if (mazePath == null) { MazeArray[ExitCell.Y, ExitCell.X].Character = 'x'; MazeArray[ExitCell.Y, ExitCell.X].IsVisited = true; MazeToBeShowed[ExitCell.Y - 1, ExitCell.X - 1] = new MazeCell(ExitCell.X - 1, ExitCell.Y - 1, MazeArray[ExitCell.Y, ExitCell.X].Character); StoredMazeArray[ExitCell.Y, ExitCell.X] = MazeArray[ExitCell.Y, ExitCell.X]; CopyMaze(MazeArray, StoredMazeArray); CopyMaze(StoredMazeToBeShowed, MazeToBeShowed); MazeQueue.Clear(); } else { foreach (var mazeCell in mazePath) { if (mazeCell.Character != ExitCell.Character) { MazeArray[mazeCell.Y, mazeCell.X].Character = '.'; } else { MazeArray[mazeCell.Y, mazeCell.X].Character = '@'; ExitCell.Character = MazeArray[mazeCell.Y, mazeCell.X].Character; } } var canvasPath = new List <MazeCell>(); foreach (MazeCell mazeCell in mazePath) { canvasPath.Add(new MazeCell(mazeCell.X - 1, mazeCell.Y - 1, mazeCell.Character)); canvasPath[0].IsVisited = mazeCell.IsVisited; } mazePath.Clear(); mazePath.AddRange(canvasPath); StoredMazeArray[ExitCell.Y, ExitCell.X] = ExitCell; CopyMaze(MazeArray, StoredMazeArray); CopyMaze(StoredMazeToBeShowed, MazeToBeShowed); MazeQueue.Clear(); } if (mazePath != null) { CellsInMazePath = mazePath.Count; } }
public void SolveMazeMultipleExits(MazeCell[,] mazeArray) { InitializeMaze(mazeArray); var storedMazeArray = new MazeCell[mazeArray.GetLength(0), mazeArray.GetLength(1)]; CopyMaze(storedMazeArray, mazeArray); while (ExitCells.Count != 0) { ExitCell = ExitCells.Dequeue(); mazeArray[ExitCell.Y, ExitCell.X].IsVisited = false; CurrentCell = EntryCell; var mazePath = FindShortestPath(EntryCell, ExitCell, CurrentCell, MazeQueue, mazeArray); if (mazePath == null) { Console.WriteLine($"Could not find path to {ExitCell}."); mazeArray[ExitCell.Y, ExitCell.X].Character = 'x'; mazeArray[ExitCell.Y, ExitCell.X].IsVisited = true; MazeQueue.Clear(); } else { foreach (var mazeCell in mazePath) { if (mazeCell.Character != ExitCell.Character) { mazeArray[mazeCell.Y, mazeCell.X].Character = '.'; } else { mazeArray[mazeCell.Y, mazeCell.X].Character = '@'; ExitCell.Character = mazeArray[mazeCell.Y, mazeCell.X].Character; } DisplayMaze(mazeArray); } Console.WriteLine($"Shortest path from {EntryCell} to {ExitCell} found."); Console.WriteLine(); MazeQueue.Clear(); storedMazeArray[ExitCell.Y, ExitCell.X] = ExitCell; CopyMaze(mazeArray, storedMazeArray); } } }
private void InitializeMaze(MazeCell[,] mazeArray) { foreach (var mazeCell in mazeArray) { if (mazeCell.Character == 'm') { EntryCell = mazeCell; CurrentCell = EntryCell; } if (mazeCell.Character == 'e') { ExitCells.Enqueue(mazeCell); } if (mazeCell.Character == '0' || mazeCell.Character == 'm') { mazeCell.IsVisited = false; } else { mazeCell.IsVisited = true; } MazeQueue.Clear(); } }