about summary refs log blame commit diff stats
path: root/algorithms/java/BFS.java
blob: 475a398f51718dbe0fc058a6fce29ecb259daa18 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
           















                                                       
                            














                                                   
                                                                                                  
                                     





                                                                       
                         




                                        








                                                               
                                              







                                                             



                                                                                 
                                                       

                                                              

                     
 




                                                                       



                                                              
 

                                      
                                                    


                                                                   
                              









                                                                 
                         
                     
                                     


                                                                        
                                              

                                                     
                                                                  





                                                 
                

                                                   



                                            














                                                                                 


                                                 

                                                                            
 



                                                                                          
                                      
                                                   
                                             
             
                             


                             










                                         

     
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 + dir[i][0];
            int cury = start.y + dir[i][1];

            // Out of bounds check.
            if (curx < 0 || cury < 0
                || curx > maze.length - 1 || cury > maze[0].length - 1)
                continue;

            // Marker cell.
            if (maze[curx][cury] == '#')
                System.out.print("!");

            // 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[0].length];

                for (int q = 0; q < maze.length; q++) {
                    for (int j = 0; j < maze[q].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
                }

                // Marker cell.
                System.out.print("|");
                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 {
            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[0].length];
        Coordinates[][] path = new Coordinates[maze.length][maze[0].length];

        System.out.println(String.format("rows:%d cols:%d", maze.length, maze[0].length));

        for (int i = 0; i < maze.length; i++)
            for (int j = 0; j < maze[i].length; j++) {
                visited[i][j] = false;
                path[i][j] = new Coordinates(0, 0);
                System.out.print(maze[i][j]);
            }
        System.out.println();

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