Creamos una matriz de carácteres para guardar el mapa y otra del mismo tamaño para almacenar números. Entonces simplemente hay que recorrer dicha matriz: si en la posición hay una mina el número lo ponemos a un máximo declarado antes, de lo contrario será el mínimo entre el de arriba y las dos diagonales de arriba + 1. No hace falta decir que la primera fila ha de valer cero en todas las casillas excepto las que tengan minas. La solución final es el mínimo de todas las posiciones de la última fila.
Ya que estamos. Me tome el trabajo de pasar el algortimo a Java

import java.io.*;
import java.util.Random;
public class minas {
public static void main() throws Exception {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
char[][] caracteres;
int [][] resultado;
System.out.print("Ingrese cantidad de filas:");
int filas=Integer.parseInt(br.readLine());
System.out.print("Ingrese cantidad de columnas:");
int columnas=Integer.parseInt(br.readLine());
caracteres=new char[filas][columnas];
resultado=new int[filas][columnas];
Random rnd=new Random();
for (int i=0; i<filas; i++)
{
for(int j=0;j<columnas;j++)
{
//genero la tabla/////////////
int aleat=rnd.nextInt(2);
if (aleat==1)
caracteres[i][j]='M';
else caracteres[i][j]='L';
//////////////////////////////
//
if (caracteres[i][j]=='M')
resultado[i][j]=99;
else //si esta libre
{
if (i==0) //si es la primera fila
resultado[i][j]=0;
else //en cualquier otro caso
{
if ((j>0)&&(j<columnas-1))
resultado[i][j]=min(resultado[i-1][j-1]+1,resultado[i-1][j],resultado[i-1][j+1]+1);
else if (j==0)
resultado[i][j]=min(resultado[i-1][j],resultado[i-1][j+1]+1,99);
else
resultado[i][j]=min(resultado[i-1][j],resultado[i-1][j-1]+1,99);
}
}
}
}
int menor=99;
for (int j=0; j<columnas;j++)
if (resultado[filas-1][j]<menor)
menor=resultado[filas-1][j];
if (menor==99)
System.out.println("Yum Yum");
else System.out.println(menor);
}
public static int min(int num1, int num2, int num3){
int menor=num1;
if (num2<num1)
menor=num2;
if (num3<menor)
menor=num3;
return menor;
}
}