Java program:
import java . util . * ; class GFG { static class Pair { int first , second ; Pair ( int a , int b ) { first = a ; second = b ; } } static int row = 5 ; static int col = 5 ; static int minDistance [ ] [ ] = new int [ row + 1 ] [ col + 1 ] , visited [ ] [ ] = new int [ row + 1 ] [ col + 1 ] ; static Queue < Pair > que = new LinkedList < > ( ) ; static boolean isValid ( int grid [ ] [ ] , int i , int j ) { if ( i < 0 j < 0 j >= col i >= row grid [ i ] [ j ] != 0 visited [ i ] [ j ] != 0 ) return false ; return true ; } static int findMinPathminDistance ( int grid [ ] [ ] , int sourceRow , int sourceCol ) { if ( sourceCol == 0 sourceCol == col - 1 sourceRow == 0 sourceRow == row - 1 ) return 0 ; int minFromSource = row * col ; for ( int i = 0 ; i < row ; i ++ ) for ( int j = 0 ; j < col ; j ++ ) minDistance [ i ] [ j ] = row * col ; que . add ( new Pair ( sourceRow , sourceCol ) ) ; minDistance [ sourceRow ] [ sourceCol ] = 0 ; visited [ sourceRow ] [ sourceCol ] = 1 ; while ( que . size ( ) > 0 ) { Pair cell = que . peek ( ) ; int cellRow = cell . first ; int cellCol = cell . second ; if ( isValid ( grid , cellRow + 1 , cellCol ) ) { que . add ( new Pair ( cellRow + 1 , cellCol ) ) ; minDistance [ cellRow + 1 ] [ cellCol ] = Math . min ( minDistance [ cellRow + 1 ] [ cellCol ] , minDistance [ cellRow ] [ cellCol ] + 1 ) ; visited [ cellRow + 1 ] [ cellCol ] = 1 ; } if ( isValid ( grid , cellRow - 1 , cellCol ) ) { que . add ( new Pair ( cellRow - 1 , cellCol ) ) ; minDistance [ cellRow - 1 ] [ cellCol ] = Math . min ( minDistance [ cellRow - 1 ] [ cellCol ] , minDistance [ cellRow ] [ cellCol ] + 1 ) ; visited [ cellRow - 1 ] [ cellCol ] = 1 ; } if ( isValid ( grid , cellRow , cellCol + 1 ) ) { que . add ( new Pair ( cellRow , cellCol + 1 ) ) ; minDistance [ cellRow ] [ cellCol + 1 ] = Math . min ( minDistance [ cellRow ] [ cellCol + 1 ] , minDistance [ cellRow ] [ cellCol ] + 1 ) ; visited [ cellRow ] [ cellCol + 1 ] = 1 ; } if ( isValid ( grid , cellRow , cellCol - 1 ) ) { que . add ( new Pair ( cellRow , cellCol - 1 ) ) ; minDistance [ cellRow ] [ cellCol - 1 ] = Math . min ( minDistance [ cellRow ] [ cellCol - 1 ] , minDistance [ cellRow ] [ cellCol ] + 1 ) ; visited [ cellRow ] [ cellCol - 1 ] = 1 ; } que . remove ( ) ; } int i ; for ( i = 0 ; i < col ; i ++ ) minFromSource = Math . min ( minFromSource , minDistance [ 0 ] [ i ] ) ; for ( i = 0 ; i < col ; i ++ ) minFromSource = Math . min ( minFromSource , minDistance [ row - 1 ] [ i ] ) ; for ( i = 0 ; i < row ; i ++ ) minFromSource = Math . min ( minFromSource , minDistance [ i ] [ 0 ] ) ; for ( i = 0 ; i < row ; i ++ ) minFromSource = Math . min ( minFromSource , minDistance [ i ] [ col - 1 ] ) ; if ( minFromSource == row * col ) return - 1 ; return minFromSource ; } public static void main ( String args [ ] ) { int sourceRow = 3 , sourceCol = 3 ; int grid [ ] [ ] = { { 1 , 1 , 1 , 1 , 0 } , { 0 , 0 , 1 , 0 , 1 } , { 0 , 0 , 1 , 0 , 1 } , { 1 , 0 , 0 , 0 , 1 } , { 1 , 1 , 0 , 1 , 0 } } ; System . out . println ( findMinPathminDistance ( grid , sourceRow , sourceCol ) ) ; } }

Index/key variables: cellCol, cellRow, i, j, sourceCol, sourceRow
Accumulator variables: i, j
Iterator variables: i, j
Class/struct names: GFG, Pair