P1363
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
struct node{int x,y;};
queue<node> r;
const int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
int n,m;
bool v[1505][1505];
char a[1505][1505];
void bfs(int i,int j)
{
queue<node> q;
swap(r,q);
v[i][j]=1;
r.push((node){i,j});
while(!r.empty()){
node z=r.front();
r.pop();
for(int i=0;i<4;i++){
int tx=z.x+dx[i],ty=z.y+dy[i];
if(tx<1 || ty<1 || tx>n || ty>m || v[tx][ty] || a[tx][ty]=='#')
continue;
v[tx][ty]=1;
r.push((node){tx,ty});
}
}
}
int main()
{
ios::sync_with_stdio(0);
while(cin>>n>>m){
memset(a,0,sizeof(a));
memset(v,0,sizeof(v));
int sx,sy;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='S'){
sx=i,sy=j;
}
}
}
bfs(sx,sy);
bool f=0;
for(int i=1;i<=m;i++) if(v[1][i]==1 && v[n][i]==1){
cout<<"Yes\n";
f=1;
break;
}
if(!f) for(int i=1;i<=n;i++) if(v[i][1]==1 && v[i][m]==1){
cout<<"Yes\n";
f=1;
break;
}
if(!f) cout<<"No\n";
}
return 0;
}