In: Computer Science
#Using BFS:
// Java program to find the shortest
// path between a given source cell
// to a destination cell.
import java.util.*;
class example
{
static int ROW = 9;
static int COL = 10;
// To store matrix cell cordinates
static class Point
{
int x;
int y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
};
// A Data Structure for queue used in BFS
static class queueNode
{
Point pt; // The cordinates of a cell
int dist; // cell's distance of from the source
public queueNode(Point pt, int dist)
{
this.pt = pt;
this.dist = dist;
}
};
// check whether given cell (row, col)
// is a valid cell or not.
static boolean isValid(int row, int col)
{
// return true if row number and
// column number is in range
return (row >= 0) && (row < ROW)
&&
(col >= 0) && (col <
COL);
}
// These arrays are used to get row and column
// numbers of 4 neighbours of a given cell
static int rowNum[] = {-1, 0, 0, 1};
static int colNum[] = {0, -1, 1, 0};
// function to find the shortest path between
// a given source cell to a destination cell.
static int BFS(int mat[][], Point src,
Point dest)
{
// check source and destination cell
// of the matrix have value 1
if (mat[src.x][src.y] != 1 ||
mat[dest.x][dest.y] != 1)
return -1;
boolean [][]visited = new boolean[ROW][COL];
// Mark the source cell as visited
visited[src.x][src.y] = true;
// Create a queue for BFS
Queue<queueNode> q = new
LinkedList<>();
// Distance of source cell is 0
queueNode s = new queueNode(src, 0);
q.add(s); // Enqueue source cell
// Do a BFS starting from source cell
while (!q.isEmpty())
{
queueNode curr = q.peek();
Point pt = curr.pt;
// If we have reached the
destination cell,
// we are done
if (pt.x == dest.x && pt.y
== dest.y)
return
curr.dist;
// Otherwise dequeue the front
cell
// in the queue and enqueue
// its adjacent cells
q.remove();
for (int i = 0; i < 4;
i++)
{
int row = pt.x +
rowNum[i];
int col = pt.y +
colNum[i];
// if adjacent
cell is valid, has path
// and not
visited yet, enqueue it.
if (isValid(row,
col) &&
mat[row][col] == 1
&&
!visited[row][col])
{
// mark cell as visited and enqueue it
visited[row][col] = true;
queueNode Adjcell = new queueNode(new Point(row,
col),
curr.dist + 1 );
q.add(Adjcell);
}
}
}
// Return -1 if destination cannot be reached
return -1;
}
// Driver Code
public static void main(String[] args)
{
int mat[][] = {{ 1, 0, 1, 1, 1, 1, 0, 1, 1, 1 },
{ 1, 0, 1, 0, 1, 1, 1, 0, 1, 1 },
{ 1, 1, 1, 0, 1, 1, 0, 1, 0, 1 },
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
{ 1, 1, 1, 0, 1, 1, 1, 0, 1, 0 },
{ 1, 0, 1, 1, 1, 1, 0, 1, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 1, 1, 1, 1, 0, 1, 1, 1 },
{ 1, 1, 0, 0, 0, 0, 1, 0, 0, 1 }};
Point source = new Point(0, 0);
Point dest = new Point(3, 4);
int dist = BFS(mat, source, dest);
if (dist != Integer.MAX_VALUE)
System.out.println("Shortest Path
is " + dist);
else
System.out.println("Shortest Path
doesn't exist");
}
}
#Using Recursion:
class Main
{
// M x N matrix
private static final int M = 10;
private static final int N = 10;
// Check if it is possible to go to (x, y) from
current position. The
// function returns false if the cell has value 0 or
already visited
private static boolean isSafe(int mat[][], int
visited[][], int x, int y)
{
return !(mat[x][y] == 0 ||
visited[x][y] != 0);
}
// if not a valid position, return false
private static boolean isValid(int x, int y)
{
return (x < M && y <
N && x >= 0 && y >= 0);
}
// Find Shortest Possible Route in a Matrix mat
from source cell (0, 0)
// to destination cell (x, y)
// 'min_dist' stores length of longest path from
source to destination
// found so far and 'dist' maintains length of path
from source cell to
// the current cell (i, j)
public static int findShortestPath(int mat[][], int
visited[][],
int i, int j, int x, int y,
int min_dist, int dist)
{
// if destination is found, update
min_dist
if (i == x && j == y)
{
return
Integer.min(dist, min_dist);
}
// set (i, j) cell as
visited
visited[i][j] = 1;
// go to bottom cell
if (isValid(i + 1, j) &&
isSafe(mat, visited, i + 1, j)) {
min_dist =
findShortestPath(mat, visited, i + 1, j, x, y,
min_dist, dist + 1);
}
// go to right cell
if (isValid(i, j + 1) &&
isSafe(mat, visited, i, j + 1)) {
min_dist =
findShortestPath(mat, visited, i, j + 1, x, y,
min_dist, dist + 1);
}
// go to top cell
if (isValid(i - 1, j) &&
isSafe(mat, visited, i - 1, j)) {
min_dist =
findShortestPath(mat, visited, i - 1, j, x, y,
min_dist, dist + 1);
}
// go to left cell
if (isValid(i, j - 1) &&
isSafe(mat, visited, i, j - 1)) {
min_dist =
findShortestPath(mat, visited, i, j - 1, x, y,
min_dist, dist + 1);
}
// Backtrack - Remove (i, j)
from visited matrix
visited[i][j] = 0;
return min_dist;
}
public static void main(String[] args)
{
int mat[][] =
{
{ 1, 1, 1, 1, 1, 0, 0, 1, 1, 1 },
{ 0, 1, 1, 1, 1, 1, 0, 1, 0, 1 },
{ 0, 0, 1, 0, 1, 1, 1, 0, 0, 1 },
{ 1, 0, 1, 1, 1, 0, 1, 1, 0, 1 },
{ 0, 0, 0, 1, 0, 0, 0, 1, 0, 1 },
{ 1, 0, 1, 1, 1, 0, 0, 1, 1, 0 },
{ 0, 0, 0, 0, 1, 0, 0, 1, 0, 1 },
{ 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
{ 1, 1, 1, 1, 1, 0, 0, 1, 1, 1 },
{ 0, 0, 1, 0, 0, 1, 1, 0, 0, 1 },
};
// construct a matrix to keep
track of visited cells
int[][] visited = new
int[M][N];
int min_dist =
findShortestPath(mat, visited, 0, 0, 7, 5,
Integer.MAX_VALUE, 0);
if (min_dist !=
Integer.MAX_VALUE) {
System.out.println("The shortest path from source to destination
"
+ "has length " + min_dist);
}
else {
System.out.println("Destination can't be reached from
source");
}
}
}