```cpp
#include<bits/stdc++.h>
using namespace std;
int n,m,i,j;
char a1[4505][4505];
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
bool a[4505][4505],flag;
void dfs(int x,int y){
if(flag)
return;
if(a1[x][y]=='S'){
flag=true;
return;
}
for(i=0;i<4;i++){
int xx=x+dx[i];
int yy=y+dy[i];
if(a[xx][yy]){
a[x][y]=false;
dfs(xx,yy);
a[x][y]=true;
}
}
return;
}
int main(){
ios::sync_with_stdio(false);
while(cin>>n>>m){
memset(a,false,sizeof(a));
memset(a1,'0',sizeof(a1));
flag=false;
int x,y;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
cin>>a1[i][j];
if(a1[i][j]=='S'){
x=i+n;
y=j+m;
}
a1[i+n][j]=a1[i+n+n][j]=a1[i][j+m]=a1[i+n+n][j+m]=a1[i][j+m+m]=a1[i+n][j+m+m]=a1[i+n+n][j+m+m]=a1[i+n][j+m]=a1[i][j];
if(a1[i+n][j+m]=='S')
a1[i+n][j+m]='0';
if(a1[i][j]=='S'||a1[i][j]=='.')
a[i+n][j]=a[i+n+n][j]=a[i][j+m]=a[i+n+n][j+m]=a[i][j+m+m]=a[i+n][j+m+m]=a[i+n+n][j+m+m]=a[i+n][j+m]=a[i][j]=true;
}
}
dfs(x,y);
if(flag)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
优化版,过了一个点和样例
```
by thu_changge @ 2017-10-22 12:40:39
送你一个数据
2 2
S#
..
再送你一个数据
10 2
#.
..
S#
..
..
.#
#.
..
#.
##
当然我不知道这些数据你的代码错在哪里,反正明显错了,请你自行查查吧
by Robert @ 2017-11-03 18:18:38
等等。。第二个数据被吃了,我用A表示障碍,用C来表示小点点
10 2
AC
CC
SA
CC
CC
CA
AC
CC
AC
AA
by Robert @ 2017-11-03 18:21:12
额
by thu_changge @ 2017-11-24 19:49:23
洪水填充
by thu_changge @ 2017-11-24 19:49:52