#include<iostream>
#include<climits>
#include<cstdio>
#include<queue>
using namespace std;
#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
typedef long long ll;
const int N = 500;
const int dx[]={1,0,-1,0};
const int dy[]={0,1,0,-1};
const ll inf = 1LL<<60;
char m[N][N+1];
ll dcost[N][N];//¼ÚS[ÜÅs­RXg
ll scost[N][N];//olðgÁ½ÌRXg
void bfs(int r,int c,char s,ll cost[N][N]){
  queue<int> Q;
  rep(i,r)rep(j,c)
    if (m[i][j] == s)cost[i][j] = 0,Q.push(i*c+j);
    else cost[i][j] = inf;
  while(!Q.empty()){
    int y = Q.front()/c,x=Q.front()%c;Q.pop();
    rep(i,4){
      int ney = y+dy[i],nex = x+dx[i];
      if (m[ney][nex] == '*' || m[ney][nex] == 'g' || m[ney][nex] == '#' || cost[ney][nex] != inf)continue;
      cost[ney][nex] = cost[y][x] + 1;
      Q.push(ney*c+nex);
    }
  }
}

/*
  e}X©çÌúÒlÍA
  min(¼ÚS[ÜÅs­AÅZÌolÜÅJ¢Ä¢ÁÄòÔ{úÒl)
  ±±ÅÌúÒlÍ (òñ¾ Æs­Â\«ª é}XÌúÒlÌa)/(»Ìæ¤È}XÌ)B
  
  KÉúÒlðßÅ¿µÄAÇ¤µ·é©ðl¦ÄÝéB
  úÒlð³çÉ¬³­Å«éÈç¬³­µÄAå«­È¢Æ¢¯È¢Èçå«­·éB
 */
double exp[N][N];
double bf(int r,int c){
  double e=0;//úÒlÌaðÁÄ¨­ÆðÉ§Â
  double pos = 0;//olÅs­Â\«Ì éêÌ
  int sy,sx;
  rep(i,r){
    rep(j,c){
      if (m[i][j] == '*' || m[i][j] == 'g' || m[i][j] == '#')continue;
      exp[i][j] = dcost[i][j];
      e += dcost[i][j];
      pos++;
      if (m[i][j] == 's')sy = i,sx = j;
    }
  }

  /*
    olÅòñÅ©çS[ÜÅ½Çè­ÜÅÌúÒlðßÅ¿·éB
    »ÌúÒlð³ÉÀÛÌúÒlðvZµÄÝÄA¬³¯êÎßÅ¿µ½úÒlæèàÁÆ¬³­Å«éB
    å«¯êÎàÁÆå«­È¢Æ¢¯È­ÈéB
   */
  double L = 0,R=1e20;
  double ans = -1;
  rep(i,300){
    double mid = (L+R)/2.;
    double newe = 0;
    rep(i,r){
      rep(j,c){
	if (m[i][j] == 'g' || m[i][j] == '#' || m[i][j] == '*')continue;
	double tmp = dcost[i][j];
	double tmp2 = scost[i][j] + mid/pos;
	newe += min(tmp,tmp2);
      }
    }
    if (newe < mid){//\zæè¬³©Á½
      ans = mid;
      R = mid - 1e-10;
    }else {//\zæèå«©Á½
      L = mid + 1e-10;
    }
  }
  return  min((double)dcost[sy][sx],scost[sy][sx]+ans/pos);

  /*
    û©·éÜÅñµÄÝ½
   */
  /*
  while(true){
    bool isupdate = false;
    double newe = 0;
    rep(i,r){
      rep(j,c){
	if (m[i][j] == 'g' || m[i][j] == '#')continue;//±±Íl¦È¢B
	double tmp = dcost[i][j];
	double tmp2 = scost[i][j] + (e)/(pos);
	if (exp[i][j] > min(tmp,tmp2)){
	  isupdate = true;
	  e -= exp[i][j];
	  exp[i][j] = min(tmp,tmp2);
	  e += exp[i][j];
	}
	newe += exp[i][j];
      }
    }
    e = newe;
    if (!isupdate)break;
  }

  /*
  ðúÌè@ª³µ­®­©`FbN·é½ßÉ¢½
  *
  double hoge = 0;
  rep(i,r){
    rep(j,c){
      if (m[i][j] == '#' || m[i][j] == 'g' || m[i][j] == '*')continue;
      hoge += min((double)dcost[i][j],scost[i][j] + e/pos);
      cout << min((double)dcost[i][j],scost[i][j] + e/pos) <<" " ;
    }
    cout << endl;
  }
  cout <<"hoge " << e <<" " << hoge/pos << endl;
  */
  //rep(i,r)rep(j,c)if (m[i][j] == 's')return exp[i][j];
}

int main(){
  int r,c;
  while(cin>>c>>r && r){
    rep(i,r)cin>>m[i];
    bfs(r,c,'*',scost);
    bfs(r,c,'g',dcost);
    printf("%.12lf\n",bf(r,c));
  }
}