class BFS { // queue of coordinates. static Coordinates[] queue = new Coordinates[1000]; private static int front = -1; private static int rear = -1; static void enqueue(Coordinates coord) { if (front == -1 && rear == -1) { front = 0; rear = 0; } else { rear++; } queue[rear] = coord; } static void dequeue() { if (front == rear) { front = -1; rear = -1; } else { front++; } } // traversing directions. private static final int[][] dir = new int[][]{ {+0, +1}, // right. {+1, +0}, // down. {+0, -1}, // left. {-1, +0}, // up. }; static void bfs(char[][] maze, Coordinates start, boolean[][] visited,Coordinates [][] path) { for (int i = 0; i < 4; i++) { int curx = start.x; int cury = start.y; curx += dir[i][0]; cury += dir[i][1]; if (curx < 0 || cury < 0 || curx > maze.length - 1 || cury > maze.length - 1) { // for square... out of maze check. continue; } // Print the maze on every iteration. for(int j = 0; j < maze.length; j++) for(int k = 0; k < maze[j].length; k++) { if (maze[j][k] == '^' || maze[j][k] == '$') System.out.print(maze[j][k]); else { if (j == curx && k == cury) System.out.print("@"); else { if (visited[j][k]) System.out.print("-"); else System.out.print(maze[j][k]); } } } System.out.println(); if (maze[curx][cury] == '$') { path[curx][cury]=new Coordinates(start.x,start.y); boolean[][] printpath=new boolean[maze.length][maze.length]; for (int q = 0; q < maze.length; q++) { for (int j = 0; j < maze.length; j++) { printpath[q][j]=false; } } printpath[0][0]=true; //start as true while(curx != 0 || cury != 0){ printpath[curx][cury] = true; int temp = curx; curx = path[curx][cury].x; cury = path[temp][cury].y; //path stores parent of current coordinate } for(int j = 0; j < maze.length; j++) for(int k = 0; k < maze[j].length; k++) { if (maze[j][k] == '^' || maze[j][k] == '$') System.out.print(maze[j][k]); else { if (j == curx && k == cury) System.out.print("@"); else { if(printpath[j][k]) System.out.print("~"); else if (visited[j][k]) System.out.print("-"); else System.out.print(maze[j][k]); } } } System.out.println(); System.exit(0); } else if (visited[curx][cury] || maze[curx][cury] == '#') { continue; } else if(maze[curx][cury]=='.') { enqueue(new Coordinates(curx, cury)); visited[curx][cury] = true; path[curx][cury]=new Coordinates(start.x,start.y); } } dequeue(); if (front == -1) { System.out.println("path not found"); System.exit(0); } else{ // System.out.println(start.x + " " + start.y); bfs(maze, queue[front], visited, path); } } public static void main(String[] args) { char[][] maze = { {'^', '#', '.'}, {'.', '.', '#'}, {'.', '.', '$'}, }; Coordinates start = new Coordinates(0,0); boolean[][] visited = new boolean[maze.length][maze.length]; Coordinates[][] path = new Coordinates[maze.length][maze.length]; for (int i = 0; i < maze.length; i++) { for (int j = 0; j < maze.length; j++) { visited[i][j] = false; path[i][j] = new Coordinates(0, 0); } } visited[0][0] = true; enqueue(start); bfs(maze, start, visited,path); } } class Coordinates { // for storing coordinates as object. public int x, y; Coordinates(int x,int y) { this.x = x; this.y = y; } }