#include <cstdio>
#include <cstring>
#include <stack>
#include <vector>
#include <utility>
#define st first
#define nd second
#define MAXN 1000
using namespace std;
typedef pair<int,int> pii;
int n,m,ans;
int MI,MJ,PI,PJ;
char MAP[MAXN+10][MAXN+10];

int dCnt,bCnt,dfn[MAXN+10][MAXN+10],low[MAXN+10][MAXN+10];
stack<pii> stk;
vector<int> bel[MAXN+10][MAXN+10];

int tot,e[MAXN*MAXN*20+10][2],p[MAXN*MAXN*4+10];
int q[MAXN*MAXN*4+10][3];
bool reach[MAXN+10][MAXN+10],vis[MAXN+10][MAXN+10][4];

short dir[4][2] = {1,0,-1,0,0,1,0,-1};

void adde(int sn,int fn)
{
    e[++tot][0] = fn; e[tot][1] = p[sn]; p[sn] = tot;
}
int getId(int i,int j,int k)
{
    return ((i-1)*m+j-1)*4+k;
}
void getCo(int val,int &i,int &j,int &k)
{
    i = val/4/m+1; j = val/4%m+1; k = val%4;
}
bool legal(int i,int j)
{
    return i>0 && j>0 && i<=n && j<=m && MAP[i][j] != 'o';
}
void dfs(int i,int j)
{
    int ii,jj,k;
    dfn[i][j] = low[i][j] = ++dCnt;
    
    for(k=0;k<4;k++)
    {
        ii = i+dir[k][0]; jj = j+dir[k][1];
        if(!legal(ii,jj)) continue;
        stk.push(pii(i,j));
        if(!low[ii][jj])
        {
            dfs(ii,jj);
            low[i][j] = min(low[i][j],low[ii][jj]);
            if(low[ii][jj] < dfn[i][j]) continue;
            
            bCnt++;
            do
            {
                ii = stk.top().st; jj = stk.top().nd;
                stk.pop();
                bel[ii][jj].push_back(bCnt);
            }while(ii != i || jj != j);
            bel[i][j].push_back(bCnt);
        }
        else low[i][j] = min(low[i][j],dfn[ii][jj]);
    }
}
bool sameBlock(int i1,int j1,int i2,int j2)
{
    int i,j;
    for(i=bel[i1][j1].size()-1;i>=0;i--) for(j=bel[i2][j2].size()-1;j>=0;j--)
        if(bel[i1][j1][i] == bel[i2][j2][j]) return true;
    return false;
}
void build()
{
    int i,j,i1,j1,k1,i2,j2,k2;
    
    for(i=1;i<=n;i++) for(j=1;j<=m;j++) for(k1=0;k1<4;k1++)
    {
        i1 = i+dir[k1][0]; j1 = j+dir[k1][1];
        if(!legal(i1,j1)) continue;
        for(k2=0;k2<4;k2++) if(k1 != k2)
        {
            i2 = i+dir[k2][0]; j2 = j+dir[k2][1];
            if(!legal(i2,j2)) continue;
            if(sameBlock(i1,j1,i2,j2)) adde(getId(i,j,k1),getId(i,j,k2));
        }
    }
    
    for(i=1;i<=n;i++) for(j=1;j<=m;j++) for(k1=0;k1<4;k1++)
    {
        i1 = i+dir[k1][0]; j1 = j+dir[k1][1];
        if(!legal(i1,j1)) continue;
        i2 = i+dir[k1^1][0]; j2 = j+dir[k1^1][1];
        if(!legal(i2,j2)) continue;
        adde(getId(i,j,k1),getId(i2,j2,k1));
    }
}
void preBfs()
{
    int head = 1,tail = 2;
    int i,j,ii,jj,k;
    memset(reach,0,sizeof(reach));
    q[1][0] = MI; q[1][1] = MJ; reach[MI][MJ] = true;
    while(head != tail)
    {
        i = q[head][0]; j = q[head++][1];
        for(k=0;k<4;k++)
        {
            ii = i+dir[k][0]; jj = j+dir[k][1];
            if(!legal(ii,jj) || MAP[ii][jj]=='s' || reach[ii][jj]) continue;
            reach[ii][jj] = true;
            q[tail][0] = ii; q[tail++][1] = jj;
        }
    }
}
void bfs()
{
    int head = 1,tail = 1;
    int i,j,k,ii,jj,kk,t;
    memset(vis,0,sizeof(vis));
    for(k=0;k<4;k++) if(reach[PI+dir[k][0]][PJ+dir[k][1]])
    {
        q[tail][0] = PI; q[tail][1] = PJ; q[tail++][2] = k;
        vis[PI][PJ][k] = true;
    }
    while(head != tail)
    {
        i = q[head][0]; j = q[head][1]; k = q[head++][2];
        for(t=p[getId(i,j,k)];t;t=e[t][1])
        {
            getCo(e[t][0],ii,jj,kk);
            if(vis[ii][jj][kk]) continue;
            vis[ii][jj][kk] = true;
            q[tail][0] = ii; q[tail][1] = jj; q[tail++][2] = kk;
        }
    }
}
int main()
{
    int i,j,k;
    while(scanf("%d%d",&n,&m),n||m)
    {
        dCnt = bCnt = 0;
        tot = 0; memset(p,0,sizeof(p));
        memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low));
        for(i=1;i<=n;i++) for(j=1;j<=m;j++) bel[i][j].clear();
        
        for(i=1;i<=n;i++) scanf("%s",MAP[i]+1);
        for(i=1;i<=n;i++) for(j=1;j<=m;j++)
        {
            if(MAP[i][j] == 'r') { MI = i; MJ = j;}
            else if(MAP[i][j] == 's') { PI = i; PJ = j;}
        }
        dfs(MI,MJ);
        build(); preBfs(); bfs();
        for(i=1,ans=0;i<=n;i++) for(j=1;j<=m;j++)
            for(k=0;k<4;k++) if(vis[i][j][k]) { ans++; break;}
        printf("%d\n",ans);
    }
    return 0;
}