#include <iostream>
#include <queue>
#include <string.h>
using namespace std;
/****************************************************************************************************************
题意:S为起点,D为终点,X为墙壁, '.'为空路,问是否可以从S走到D
思路:
1,广搜找路径
注意:
1,每次要从队首元素的邻接点开始遍历
2,定义了三个队列,一个存元素,另外两个存坐标
Input: Output:
4 4 No
S.X.
..X.
..XD
..X.
****************************************************************************************************************/
char map[10][10];
int visit[10][10]={0};
int exist=0;
queue <char> Q1;
queue <int> Q2,Q3;
void bfs(int X,int Y)
{
visit[X][Y]=1;
Q1.push(map[X][Y]);
Q2.push(X);
Q3.push(Y);
while(!Q1.empty())
{
char c=Q1.front();
int x=Q2.front();
int y=Q3.front();
//cout<<"c= "<<c<<" x= "<<x<<" y= "<<y<<endl;
Q1.pop();
Q2.pop();
Q3.pop();
if(c == 'D') {exist=1;}
if(!visit[x-1][y] && map[x-1][y] != 'X') {visit[x-1][y]=1; Q1.push(map[x-1][y]);Q2.push(x-1);Q3.push(y);}
if(!visit[x+1][y] && map[x+1][y] != 'X') {visit[x+1][y]=1; Q1.push(map[x+1][y]);Q2.push(x+1);Q3.push(y);}
if(!visit[x][y-1] && map[x][y-1] != 'X') {visit[x][y-1]=1; Q1.push(map[x][y-1]);Q2.push(x);Q3.push(y-1);}
if(!visit[x][y+1] && map[x][y+1] != 'X') {visit[x][y+1]=1; Q1.push(map[x][y+1]);Q2.push(x);Q3.push(y+1);}
}
}
int main()
{
int n,m,T;
while(cin>>n>>m>>T)
{
memset(map,'X',sizeof(map));
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= m;j ++)
cin>>map[i][j];
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= m;j ++)
if(map[i][j] == 'S')
bfs(i,j);
if(!exist)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
return 0;
}